如何将R中公共列上的两个数据框与其他数据框的总和合并?
Windows 7 上的 R 版本 2.11.1 32 位
我有两个数据集:data_A 和 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
现在我想将 data_B 的 ACTION 添加到 data_A,如果它们的 USER_A 和 USER_B 相等。如上面的示例,结果将是:
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
那么我该如何实现呢?
R Version 2.11.1 32-bit on Windows 7
I got two data sets: data_A and 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
Now I want to add the ACTION of data_B to the data_A if their USER_A and USER_B are equal. As the example above, the result would be:
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
So how could I achieve it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以在
plyr
包中使用ddply
并将其与merge
结合使用:请注意,使用参数 < 调用
merge
。 code>all.x=TRUE - 这将返回传递给merge
的第一个 data.frame 中的所有值,即 data_A:You can use
ddply
in packageplyr
and combine it withmerge
:Notice that
merge
is called with the parameterall.x=TRUE
- this returns all of the values in the first data.frame passed tomerge
, i.e. data_A:使用类似数据库的操作很容易完成这种事情。在这里,我使用包
sqldf
进行左(外)连接,然后汇总结果对象:这导致:
现在我们只需要对两个
ACTION
列求和:这给出期望的结果:
这可以使用标准 R 函数
merge
来完成:因此我们可以将上面的
sqldf()
调用替换为:而第二行使用
transform( )
保持不变。This sort of thing is quite easy to do with a database-like operation. Here I use package
sqldf
to do a left (outer) join and then summarise the resulting object:This results in:
Now we just need sum the two
ACTION
columns:Which gives the desired result:
This can be done using standard R function
merge
:So we can replace the
sqldf()
call above with:whilst the second line using
transform()
remains the same.我们可以使用 {powerjoin}:
如果发生冲突,将使用提供给
conflict
参数的函数在成对的冲突列上。
我们还可以按行使用 sum(, na.rm = TRUE) 来达到相同的效果:
We can use {powerjoin}:
In case of conflict, the function fed to the
conflict
argument will be usedon pairs of conflicting columns.
We can also use
sum(, na.rm = TRUE)
row-wise for the same effect :