数据帧的第n列的总和

时间:2019-02-11 09:45:30

标签: r dplyr tidyverse

让我们假设数据

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以外,是否还有解决此问题的整洁方法?

2 个答案:

答案 0 :(得分:4)

这是一种更通用的方法,它假定数据框中的列数为偶数,即

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

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

答案 1 :(得分: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的anwer的方法,因此可以在更大的数据集上工作:

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