根据无序的列对聚合数据帧

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


     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。在分组的数据中,这两行的size列的总和将添加到单行中。因此,换句话说,我想总结我要对(id1,id2)的(无序)集合进行分组的数据。我找到了一种使用apply使用一个自定义函数来检查整个数据集中的反向列对,但是这样做的速度非常慢。有谁知道用另一种方式做这件事的方法,也许plyr在基本软件包中使用某种方法会更有效?


慕哥9229398
浏览 493回答 3
3回答

潇潇雨雨

一种方法是与创建额外的列pmax和pmin的id1和id2如下。我将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 namesDT.OUT <- DT[, list(size=sum(size)),&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; by=list(id1 = pmin(id1, id2), id2 = pmax(id1, id2))]#&nbsp; &nbsp; &nbsp;id1&nbsp; id2 size# 1: 5400 5505&nbsp; &nbsp;18# 2: 5033 5458&nbsp; &nbsp; 1# 3: 5452 2873&nbsp; &nbsp;24# 4: 5452 5213&nbsp; &nbsp; 2# 5: 5452 4242&nbsp; &nbsp;26# 6: 4823 4823&nbsp; &nbsp; 4

慕后森

替代方法:R> library(igraph)R> DF&nbsp; &nbsp;id1&nbsp; id2 size1 5400 5505&nbsp; &nbsp; 72 5033 5458&nbsp; &nbsp; 13 5452 2873&nbsp; &nbsp;244 5452 5213&nbsp; &nbsp; 25 5452 4242&nbsp; &nbsp;266 4823 4823&nbsp; &nbsp; 47 5505 5400&nbsp; &nbsp;11R> g&nbsp; <- graph.data.frame(DF, directed=F)R> g&nbsp; <- simplify(g, edge.attr.comb="sum", remove.loops=FALSE)R> DF <- get.data.frame(g)R> DF&nbsp; &nbsp;id1&nbsp; id2 size1 5400 5505&nbsp; &nbsp;182 5033 5458&nbsp; &nbsp; 13 5452 2873&nbsp; &nbsp;244 5452 5213&nbsp; &nbsp; 25 5452 4242&nbsp; &nbsp;266 4823 4823&nbsp; &nbsp; 4

慕尼黑的夜晚无繁华

我的aggregate{stats}函数方法:> df&nbsp; &nbsp;id1&nbsp; id2 size1 5400 5505&nbsp; &nbsp; 72 5033 5458&nbsp; &nbsp; 13 5452 2873&nbsp; &nbsp;244 5452 5213&nbsp; &nbsp; 25 5452 4242&nbsp; &nbsp;266 4823 4823&nbsp; &nbsp; 47 5505 5400&nbsp; &nbsp;11> df[1:2] <- t(apply(df[1:2], 1, sort))> aggregate(size ~ id1 + id2, data=df, FUN=sum)&nbsp; &nbsp;id1&nbsp; id2 size1 4823 4823&nbsp; &nbsp; 42 2873 5452&nbsp; &nbsp;243 4242 5452&nbsp; &nbsp;264 5213 5452&nbsp; &nbsp; 25 5033 5458&nbsp; &nbsp; 16 5400 5505&nbsp; &nbsp;18
打开App,查看更多内容
随时随地看视频慕课网APP