有效地折叠R数据框中的行

时间:2013-12-01 19:16:01

标签: r dataframe

我有以下玩具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

我正在寻找最有效的解决方案,因为在我的真实数据中,行数和列数非常大。聚合函数似乎太慢了。

2 个答案:

答案 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