Суммируйте по группам несколько переменных одновременно в r - PullRequest
1 голос
/ 19 марта 2020

У меня есть несколько переменных для суммирования по группам. Имена переменных имеют одинаковый первый символ и заканчиваются от 1 до n. Все переменные для суммирования находятся рядом во фрейме данных. Все, что я мог найти, это:

id<-1:nrow(df)
n<-length(id)
data2<-aggregate(cbind(vol_1,vol_2,vol_3,vol_4,vol_5,vol_6,vol_7,vol_8,vol_9,vol_10)~group,data=data1,sum,na.rm=T)

Как я могу быть эффективным, зная, что n может измениться в следующий раз?

Ответы [ 3 ]

1 голос
/ 19 марта 2020

Вы также можете использовать таблицу данных

library(data.table)
dt <- data.table(df)
dt[,.(sum(vol_1),sum(vol_2)),by=.(group)]
0 голосов
/ 19 марта 2020

Если все переменные начинаются с одного и того же символа, например, скажите «v», тогда вам пригодится функция summarise_at из пакета dplyr :

library(dplyr)
df %>%
  group_by(group) %>%
  summarise_at(vars(starts_with("v")), sum)

# A tibble: 2 x 4
  group vol_1 vol_2 vol_3
  <fct> <int> <int> <int>
1 1        29    27    24
2 2        26    28    31

Это дает тот же результат, что и ваша команда aggregate.


Данные :

set.seed(123)
df <- data.frame(id=1:10, group=gl(2, 5),
                 vol_1=sample(10), vol_2=sample(10), vol_3=sample(10))
df
   id group vol_1 vol_2 vol_3
1   1     1     3    10     8
2   2     1    10     5     7
3   3     1     2     3     2
4   4     1     8     8     1
5   5     1     6     1     6
6   6     2     9     4     3
7   7     2     1     6     4
8   8     2     7     9    10
9   9     2     5     7     9
10 10     2     4     2     5
0 голосов
/ 19 марта 2020

Кажется, вы ищете rowSums

Вы можете попробовать:

vars <- c("vol_1","vol_2","vol_3","vol_4","vol_5","vol_6","vol_7","vol_8","vol_9","vol_10")

as.matrix(vars)

rowSums(vars)
...