Сумма каждого n-го столбца фрейма данных - PullRequest
0 голосов
/ 11 февраля 2019

Давайте предположим данные,

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+c и b+d и так далее.Решение должно быть применимо или изменено очень легко для других случаев, таких как суммирование каждого второго столбца, например a+c, b+d, c+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 голосов
/ 11 февраля 2019

Вот более общий подход, который, однако, предполагает, что число столбцов в вашем фрейме данных является четным числом, т.е.

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 столбца, т.е.c and d.Используя Reduce, все первые элементы добавляются вместе, затем все секунды и так далее.Так что для вашего случая a будет добавлено с c, а b с d.Если вы хотите взять сумму каждые 3 столбца, просто измените знаменатель описанного выше метода split.default на 3. Однако учтите, что у вас должно быть количество столбцов, кратное 3 (или любому n).

0 голосов
/ 11 февраля 2019

Один из подходов заключается в использовании 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

Edit

Вот подход, основанный на ответе @ Sotos, поэтому он может работать с большим набором данных:

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