我的数据集看起来像这样:
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
是分配给定向边缘的值,用于连接 / em> id1
到 id2
。这个数据集相当大(略多于200万行)。我想要做的是对大小列求和,按id1
和id2
的无序节点对进行分组。例如,在第一行中,我们有id1=5400
和id2=5505
。数据框中存在id1=5505
和id2=5400
的另一行。在分组数据中,这两行的大小列的总和将添加到单个行中。换句话说,我想总结一下我在(无序)(id1,id2)集合上的数据。我找到了一种方法,使用apply
和一个自定义函数来检查完整数据集中的反转列对,但这种方法效果极其缓慢。有没有人知道以另一种方式做到这一点的方法,可能使用plyr
或基础包中的某些内容会更有效?
答案 0 :(得分:9)
一种方法是创建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 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
答案 1 :(得分:4)
另一种方法:
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
答案 2 :(得分:0)
我的带有aggregate{stats}
函数的方法:
> 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
> df[1:2] <- t(apply(df[1:2], 1, sort))
> aggregate(size ~ id1 + id2, data=df, FUN=sum)
id1 id2 size
1 4823 4823 4
2 2873 5452 24
3 4242 5452 26
4 5213 5452 2
5 5033 5458 1
6 5400 5505 18