16

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

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

我正在寻找重复的 Sender -- Receiver 计数并将它们转换为附加边缘。

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

其中重复的发送方-接收方之间的关系已经合并,并且重复的数量包含在边数中。

任何输入将不胜感激。

谢谢!

4

2 回答 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

为了记录,这个问题已经被问了很多很多次,仔细阅读我自己的答案会产生几个答案,这些答案将为您指明正确的道路。

于 2012-05-24T03:14:35.137 回答
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
于 2012-05-24T02:35:10.707 回答