我有一个看起来像这样的数据集:
id1 id2 size
1 5400 5505 7
2 5033 5458 1
3 5452 2873 24
4 5452 5213 2
5 5452 4242 26
6 4823 4823 4
7 5505 5400 11
其中 id1
和 id2
是图中的唯一节点,size
是分配给有向的值> 连接它们从id1
到id2
的边。该数据集相当大(略多于 200 万行)。我想要做的是对大小列进行求和,该大小列按 id1
和 id2
的无序节点对分组。例如,在第一行中,我们有 id1=5400
和 id2=5505
。数据框中存在另一行,其中 id1=5505
和 id2=5400
。在分组数据中,这两行的大小列的总和将添加到单行中。换句话说,我想总结我在一组(无序)(id1,id2)上分组的数据。我找到了一种使用 apply
和自定义函数来执行此操作的方法,该函数检查完整数据集中的反向列对,但这速度非常慢。有谁知道有另一种方法可以做到这一点,也许使用 plyr
或使用基础包中的某些东西会更有效?
最佳答案
一种方法是使用 id1
和 id2
的 pmax
和 pmin
创建额外的列,如下所示。我将在这里使用 data.table
解决方案。
require(data.table)
DT <- data.table(DF)
# Following mnel's suggestion, g1, g2 could be used directly in by
# and it could be even shortened by using `id1` and id2` as their names
DT.OUT <- DT[, list(size=sum(size)),
by=list(id1 = pmin(id1, id2), id2 = pmax(id1, id2))]
# id1 id2 size
# 1: 5400 5505 18
# 2: 5033 5458 1
# 3: 5452 2873 24
# 4: 5452 5213 2
# 5: 5452 4242 26
# 6: 4823 4823 4
关于r - 基于无序的列对聚合数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15487151/