我有一个关系数据集,我正在寻找二元信息。
我有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
重复的发件人 - 收件人之间的关系已经合并,并且重复数量包含在边数中。
任何意见都会非常感激。
谢谢!
答案 0 :(得分: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
为了记录,这个问题被问过很多次,仔细阅读my own answers会产生几个可以指向正确道路的答案。
答案 1 :(得分:6)
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