合并数据框中的行[重复]
Posted
技术标签:
【中文标题】合并数据框中的行[重复]【英文标题】:Merge Rows within Data Frame [duplicate] 【发布时间】:2012-05-30 14:48:05 【问题描述】:我有一个关系数据集,我在其中寻找二元信息。
我有 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
其中重复的发送者-接收者之间的关系已经合并,并且重复的数量包含在边数中。
任何意见将不胜感激。
谢谢!
【问题讨论】:
【参考方案1】:为了好玩,这里还有两个选项,第一个使用基本函数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。【参考方案2】: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
配对是唯一的,但我认为这是偶然的以上是关于合并数据框中的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章