数据框每第n列的总和

4

假设数据,

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个回答

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和bc和d。使用Reduce函数,首先将所有第一个元素相加,然后是所有第二个元素,以此类推。因此,在您的情况下,a将与c相加,b将与d相加。如果您想每三列求和,只需将上述split.default方法的分母更改为3。但是,请注意,您必须拥有可被3(或任何n)整除的列数。

运行正常!非常感谢。以前从未使用过reduce函数,很高兴看到一个好的例子。 - small_lebowski

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))

2
谢谢。但是假设我有一千列,如果我在这种情况下应用你的解决方案,那将会是一个问题。 另外,如果我想要推广它,例如对每第n列求和,会怎样呢? - small_lebowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接