Comment fusionner deux cadres de données sur les colonnes communes dans R avec la somme des autres?
R Version 2.11.1 32 bits sur Windows 7
j'ai deux ensembles de données: data_A et data_B:
data_A
USER_A USER_B ACTION
1 11 0.3
1 13 0.25
1 16 0.63
1 17 0.26
2 11 0.14
2 14 0.28
data_B
USER_A USER_B ACTION
1 13 0.17
1 14 0.27
2 11 0.25
maintenant je veux ajouter l'ACTION de data_B à la data_A si leur USER_A et USER_B sont égaux. Comme l'exemple ci-dessus, le résultat serait:
data_A
USER_A USER_B ACTION
1 11 0.3
1 13 0.25+0.17
1 16 0.63
1 17 0.26
2 11 0.14+0.25
2 14 0.28
alors comment pourrais-je y arriver?
2 réponses
Vous pouvez utiliser ddply
dans le paquet plyr
et le combiner avec merge
:
library(plyr)
ddply(merge(data_A, data_B, all.x=TRUE),
.(USER_A, USER_B), summarise, ACTION=sum(ACTION))
Notez que merge
est appelé avec le paramètre all.x=TRUE
- renvoie toutes les valeurs des premières données.cadre passé à merge
, i.e. data_A:
USER_A USER_B ACTION
1 1 11 0.30
2 1 13 0.25
3 1 16 0.63
4 1 17 0.26
5 2 11 0.14
6 2 14 0.28
Ce genre de chose est assez facile à faire avec une base de données, comme l'opération. Ici j'utilise package sqldf
pour faire de la gauche (extérieur) adhérer et ensuite de résumer l'objet:
require(sqldf)
tmp <- sqldf("select * from data_A left join data_B using (USER_A, USER_B)")
résultat:
> tmp
USER_A USER_B ACTION ACTION
1 1 11 0.30 NA
2 1 13 0.25 0.17
3 1 16 0.63 NA
4 1 17 0.26 NA
5 2 11 0.14 0.25
6 2 14 0.28 NA
il ne nous reste plus qu'à additionner les deux ACTION
colonnes:
data_C <- transform(data_A, ACTION = rowSums(tmp[, 3:4], na.rm = TRUE))
qui donne le résultat souhaité:
> data_C
USER_A USER_B ACTION
1 1 11 0.30
2 1 13 0.42
3 1 16 0.63
4 1 17 0.26
5 2 11 0.39
6 2 14 0.28
ceci peut être fait en utilisant la fonction standard R merge
:
> merge(data_A, data_B, by = c("USER_A","USER_B"), all.x = TRUE)
USER_A USER_B ACTION.x ACTION.y
1 1 11 0.30 NA
2 1 13 0.25 0.17
3 1 16 0.63 NA
4 1 17 0.26 NA
5 2 11 0.14 0.25
6 2 14 0.28 NA
pour que nous puissions remplacer sqldf()
l'appel ci-dessus avec:
tmp <- merge(data_A, data_B, by = c("USER_A","USER_B"), all.x = TRUE)
alors que la deuxième ligne utilise transform()
reste le même.