Comment adhérer à des trames de données basée sur la condition entre les 2 colonnes
Je suis coincé avec un projet où j'ai besoin de fusionner deux trames de données. Ils ressembler à quelque chose comme ceci:
Data1
Traffic Source Registrations Hour Minute
organic 1 6 13
social 1 8 54
Data2
Email Hour2 Minute2
test@domain.com 6 13
test2@domain2.com 8 55
J'ai la ligne suivante de code de fusionner les 2 trames de données:
merge.df <- merge(Data1, Data2, by.x = c( "Hour", "Minute"),
by.y = c( "Hour2", "Minute2"))
Il serait excellent travail, si la variable de temps (heures, & minutes) n'était pas légèrement entre les deux ensembles de données. Est-il un moyen de rendre la colonne "Minute" le match avec "Minute2" si c'est + ou - une minute?
Je pensais que je pouvais créer 2 nouvelles colonnes pour l'ensemble de données:
Data1
Traffic Source Registrations Hour Minute Minute_plus1 Minute_minus1
organic 1 6 13 14 12
social 1 8 54 55 53
Est-il possible de fusionner les 2 trames de données si "Minute2" correspond à une variable à partir soit de "Minute", "Minute_plus1", ou "Minute_minus1"? Ou est-il un moyen plus efficace pour accomplir cette fusion?
rounded.time = round(hour + minute/60, digits=n)
et essayer d'adapter l'arrondissement n
que vous souhaitez avoir +-1 minute de précision. Puis rejoindre par rounded.time
Peuvent obtenir de faux positifs si les temps sont proches, mais je suppose que personne n'en plus ou en moins si minutes ont été accidentellement à proximité.
Je pense que le
plyr
et data.table
paquets pourriez faire cela très simplement. (Je ne sais pas très bien alors je vais laisser ça à quelqu'un d'autre.)Je ne suis pas sûr que cela va fonctionner. Quelle que soit la définition de l'arrondissement, il y aura une certaine coupure entre les deux groupes, et des mesures individuelles de chaque groupe peut être arbitrairement proche. Par exemple, si vous tour la plus proche à 5 minutes, 12 et 13 seront séparés, même s'ils sont seulement 1 minute d'intervalle.
Vrai! +1 pour @Gregor
dplyr
solution
OriginalL'auteur heyydrien | 2015-04-28
Vous devez vous connecter pour publier un commentaire.
Pour des trucs comme ça j'ai l'habitude de tourner à SQL:
En fonction de la taille de vos données, vous pourriez tout aussi bien rejoindre sur
Hour
puis filtrer. À l'aide dedplyr
:si vous pourriez faire la même chose avec
base
fonctions.d1.Hour
etd1.Minute
sont 6 et 59 etd2.Hour2
etd2.Minute2
sont 7 et 0? Que de fois ils sont moins d'une minute de l'autre, maisabs(d1.Minute - d2.Minute2) > 1
.Je pense que c'est le compromis pour une fusion manuelle. Peut-être construire un avertissement ou un test d'indiquer à l'utilisateur que cela a eu lieu?
Pas à ma question, mais c'est certainement quelque chose pour l'OP à prendre en compte.
La meilleure solution pour ces commentaires cas serait de faire ces comme une sorte d'unifiée objet datetime, pas que séparer les colonnes de type entier.
Peut-être
... on abs(60 * d1.Hour + d1.Minute - 60 * d2.Hour - d2.Minute) <= 1
OriginalL'auteur Gregor