在数据框内合并行

16

我有一个关系型数据集,我在寻找双元信息。

我有4个列。发送方、接收方、属性、边缘

我想要将重复的发送方-接收方计数,并将它们转换为额外的边缘。

df <- data.frame(sender = c(1,1,1,1,3,5), receiver = c(1,2,2,2,4,5), 
                attribute = c(12,12,12,12,13,13), edge = c(0,1,1,1,1,0))

   sender receiver attribute edge
1       1        1        12    0
2       1        2        12    1
3       1        2        12    1
4       1        2        12    1
5       3        4        13    1

我希望最终结果看起来像这样:

  sender receiver attribute edge
1      1        1        12    0
2      1        2        12    3
3      3        4        13    1

将重复的发件人和收件人之间的关系合并,并将重复的数量纳入边数中。

非常感谢任何输入。

谢谢!

2个回答

20

为了好玩,这里还有两个选项,第一个使用基础函数aggregate(),第二个使用data.table包:

> aggregate(edge ~ sender + receiver + attribute, FUN = "sum", data = df)
  sender receiver attribute edge
1      1        1        12    0
2      1        2        12    3
3      3        4        13    1
4      5        5        13    0
> require(data.table)
> dt <- data.table(df)
> dt[, list(sumedge = sum(edge)), by = "sender, receiver, attribute"]
     sender receiver attribute sumedge
[1,]      1        1        12       0
[2,]      1        2        12       3
[3,]      3        4        13       1
[4,]      5        5        13       0

就记录而言,这个问题已经被问了很多很多次,浏览我的回答会给你指出正确的方向。


1
任何仅使用基础函数的答案都会得到我的加分。 - CCC

7

plyr是一个非常实用的工具库,尽管我认为您给出的输入数据得到的最终结果可能并不完全正确。

library(plyr)

ddply(df, .(sender, receiver, attribute), summarize, edge = sum(edge))

返回结果
  sender receiver attribute edge
1      1        1        12    0
2      1        2        12    3
3      3        4        13    1
4      5        5        13    0

我认为 OP 并不是想按 sender + receiver + attribute 进行分组,而只是按 sender + receiver 分组,attribute 只是顺带而来的。在这个示例中,attribute 恰好对于 sender + receiver 配对来说是唯一的,但我认为那是偶然的。 - Mark Lakata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接