骨料基于无序对

问题描述:

我有一个数据集看起来像这样列的数据帧:骨料基于无序对

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

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

我觉得写这几行代替的组合物将有助于届OP +虽然,你键入比我快 – statquant 2013-03-18 21:40:23

+1

您可以通过参数来创建在G1和G2。 – mnel 2013-03-18 21:40:36

+0

@ mnel,这太棒了。将进行编辑。任何想法如何删除重复的行基于2列没有临时变量? – Arun 2013-03-18 21:43:36

的另一种方法:

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