r - 基于无序的列对聚合数据框

标签 r aggregate plyr

我有一个看起来像这样的数据集:

     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

其中 id1id2 是图中的唯一节点,size 是分配给有向的值> 连接它们id1id2的边。该数据集相当大(略多于 200 万行)。我想要做的是对大小列进行求和,该大小列按 id1id2无序节点对分组。例如,在第一行中,我们有 id1=5400id2=5505。数据框中存在另一行,其中 id1=5505id2=5400。在分组数据中,这两行的大小列的总和将添加到单行中。换句话说,我想总结我在一组(无序)(id1,id2)上分组的数据。我找到了一种使用 apply 和自定义函数来执行此操作的方法,该函数检查完整数据集中的反向列对,但这速度非常慢。有谁知道有另一种方法可以做到这一点,也许使用 plyr 或使用基础包中的某些东西会更有效?

最佳答案

一种方法是使用 id1id2pmaxpmin 创建额外的列,如下所示。我将在这里使用 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/

相关文章:

r - 如何在以逗号分隔的单引号之间拆分字符串?

java - 使用 SqlPredicate 聚合时出现 Hazelcast 错误

mongoose - 我如何在 Mongoose 中聚合和填充

R ddply 仅汇总选定/特定/逻辑行的总和

r - 如何在 R 中的 NA 之后生成虚拟变量

r - 循环函数以构建列表

r - 在 gregexpr 和 str_extract_all 函数中进行量化的交替

r - `get_map` map函数忽略了ggmap包中的 "source"参数

c# - 帮助在提供商场景中选择我的 DDD 聚合根?

r - 在需要更新版本的 R 的 Ubuntu 10.04 上从源代码安装 RStudio