【问题标题】:Efficiently collapsing rows in an R data frame有效地折叠 R 数据框中的行
【发布时间】:2013-12-01 19:16:00
【问题描述】:

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

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

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    如果您知道 data.table 包,请按照 Jilber 所说的去做。如果没有,只需使用 aggregate().

    result = aggregate(df[,1],df[,-1],sum)
    

    在这种情况下,结果将出现在最后一列中。

    编辑:您说aggregate() 太慢了。 data.table 的主要问题是 data.table(df) 的初始化成本相当大,所以你需要摊销它。只为该操作而不是其他任何东西强制转换 data.table 是不值得的。

    所以我的建议保持不变。如果您知道包并且,您将在会话期间多次使用它的潜力,然后使用它。如果没有,请坚持aggregate()

    【讨论】:

    • +1。我个人更喜欢formula 语法:aggregate(Formula ~ ., df, sum)
    【解决方案2】:

    如果您已经尝试使用 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
    

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 2013-12-13
      • 2017-09-16
      • 2019-01-20
      • 1970-01-01
      • 2016-07-07
      • 2020-07-08
      • 1970-01-01
      相关资源
      最近更新 更多