【问题标题】:Sum of every n-th column of a data frame数据帧的每 n 列的总和
【发布时间】:2019-02-11 09:45:30
【问题描述】:

让我们假设数据,

a <- c(10, 20, 30, 40, 50)
b <- c(100, 200, 300, 400, 500)
c <- c(1, 2, 3, 4, 5)
d <- c(5, 4, 3, 2, 1)
df <- data.frame(a, b, c, d)
df
   a   b c d
1 10 100 1 5
2 20 200 2 4
3 30 300 3 3
4 40 400 4 2
5 50 500 5 1

我想对每个备用列求和,即a+cb+d等等。该解决方案应该非常容易地适用或修改到其他情况,例如每隔一列求和,即a+cb+dc+e 等。对于上面的示例,解决方案应该如下所示,

> dfsum
  aplusc bplusd
1     11    105
2     22    204
3     33    303
4     44    402
5     55    501

有什么简单的方法可以做到吗?我已经弄清楚如何进行顺序求和,例如df[,c(T, F)] + df[,c(F, T)];,但是如何计算每 n 列的总和?除了rbase,这个问题还有什么整洁的解决方案吗?

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    这是一种更通用的方法,但是假设数据框中的列数是偶数,即

    n = 2
    Reduce(`+`, split.default(df, rep(seq(ncol(df) / n), each = ncol(df) / n)))
    #   a   b
    #1 11 105
    #2 22 204
    #3 33 303
    #4 44 402
    #5 55 501
    

    上面基本上将数据帧每 2 列拆分一次,即a and bc and d。使用Reduce,将所有第一个元素相加,然后将所有秒数相加。因此,对于您的情况,a 将与c 一起添加,b 将与d 一起添加。如果要每 3 列求和,只需将上述 split.default 方法的分母更改为 3。但是,请注意,您必须有许多列可以被 3(或任何 n)整除。

    【讨论】:

    • 有效!非常感谢。从未看过reduce 函数。很高兴看到一个很好的例子。
    【解决方案2】:

    一种方法是使用mutate

    library(tidyverse)
    
    df %>% 
      mutate(aplusc = a + c,
             bplusd = b + d) %>%
      select(aplusc, bplusd)
    
    #aplusc bplusd
    #1     11    105
    #2     22    204
    #3     33    303
    #4     44    402
    #5     55    501
    

    编辑

    这是一种基于@Sotos 的答案的方法,因此它可以在更大的数据集上工作:

    Reduce(`+`, split.default(df, (seq_along(df) - 1) %/% 2))
    

    【讨论】:

    • 谢谢。但是假设我有一千列。如果我在这种情况下应用您的解决方案,那将是一个问题。其次,如果我想概括它会是什么情况,例如对每第 n 列求和。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2021-12-04
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2018-04-24
    相关资源
    最近更新 更多