数据帧的每第n列的总和

问题描述 投票:4回答:2

让我们假设数据,

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+cand b+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
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

上述基本上拆分每2列数据帧,即a and bc and d。使用Reduce,所有的第一元素加在一起,那么所有秒等。因此,对于你的情况,a将与c加入,并与b d。如果你想采取的总和,每3列,只是改变了上述split.default方法的分母为3。但是,请注意,你必须有一个数字3(或任何n)整除列。


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

编辑

这里有一个方法基于@索托斯的前面回答,因此它可以在更大的数据集的工作:

Reduce(`+`, split.default(df, (seq_along(df) - 1) %/% 2))
© www.soinside.com 2019 - 2024. All rights reserved.