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?

22
demandé sur pnuts 2011-04-24 11:37:43

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
16
répondu Andrie 2011-04-24 15:07:55

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.

14
répondu Gavin Simpson 2011-04-24 11:13:04