我有以下玩具data.frame:
> df
Fragments a b c d e
1 0.5 0.2 0.20 0.20 0.20 0.20
2 1.5 0.2 0.20 0.20 0.20 0.20
3 22.0 0.4 0.15 0.15 0.15 0.15
4 5.1 0.6 0.10 0.10 0.10 0.10
5 4.2 0.4 0.15 0.15 0.15 0.15
6 10.0 0.6 0.10 0.10 0.10 0.10
我希望将除去第一列以外的所有行相同的行(即本例中的“a”到“e”列)并在第一列上取总和(“片段”)这个折叠行中的这个例子中的列)。结果将是这个data.frame:
> collpased.df
Fragments a b c d e
1 2.0 0.2 0.20 0.20 0.20 0.20
2 26.2 0.4 0.15 0.15 0.15 0.15
3 15.1 0.6 0.10 0.10 0.10 0.10
我正在寻找最有效的解决方案,因为在我的真实数据中,行数和列数非常大。聚合函数似乎太慢了。
答案 0 :(得分:3)
如果您知道 data.table 包,请按照Jilber的说法进行操作。如果没有,请使用
aggregate()
。
result = aggregate(df[,1],df[,-1],sum)
在这种情况下,结果将在最后一列结束。
编辑:您声明aggregate()
太慢了。使用data.table
时遇到的主要问题是data.table(df)
的初始化成本非常大,因此需要对其进行摊销。仅为该操作投射data.table而不是其他任何东西,这是不值得的。
所以我的建议保持不变。如果您知道包和,您将在会话期间多次使用其潜力,然后使用它。如果没有,请坚持aggregate()
。
答案 1 :(得分:1)
如果您已尝试使用aggregate
并发现太慢,那么您可能需要尝试使用data.table包中的data.table
。
> library(data.table)
> dt <- data.table(df)
> dt[,list(Fragments=sum(Fragments)), by=list(a,b,c,d,e)]
a b c d e Fragments
1: 0.2 0.20 0.20 0.20 0.20 2.0
2: 0.4 0.15 0.15 0.15 0.15 26.2
3: 0.6 0.10 0.10 0.10 0.10 15.1