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

问题描述 投票:7回答:3

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

     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或基础包中的东西会更有效?

r aggregate plyr
3个回答
9
投票

一种方法是使用pmaxpmin以及id1as创建额外的列。我会在这里使用id2解决方案。

data.table

4
投票

另一种方法:

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

0
投票

我用R> library(igraph) R> DF 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 R> g <- graph.data.frame(DF, directed=F) R> g <- simplify(g, edge.attr.comb="sum", remove.loops=FALSE) R> DF <- get.data.frame(g) R> DF 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 函数的方法:

aggregate{stats}
© www.soinside.com 2019 - 2024. All rights reserved.