Рассчитать сумму списка переменных по группам

У меня есть data.table с одним ключом и около 100 числовых строк, одна из которых установлена ​​на ключ. Я хотел бы создать новую переменную, которая содержит суммирование каждой числовой строки, сгруппированные по ключу.

Например, мои данные сейчас

ID Count1 Count2 Count3
1   1      3      0
1   3      3      3
2   1      2      1
3   1      1      2

То, что я хотел бы иметь:

ID Count1 Count2 Count3
1   4      6      3
2   1      2      1
3   1      1      2

Я пробовал так много способов получить это. Я знаю, что могу сделать:

Y <- X[, list(Count=sum(Count1), Count2=sum(Count2), Count3=sum(Count3), by = ID]

Однако у меня есть сотни переменных, и я получаю только их имена в списке. Как мне поступить с этим?

Большое спасибо за вашу помощь.

Вот код для генерации тестовых данных:

ID <-c(rep(210, 9), rep(3917,6))
Count1 <- c(1,1,0,1,3,1,4,1,1,1,1,1,1,0,1)
Count2 <- c(1,0,0,1,0,1,0,1,1,1,1,1,1,0,1)
Count3 <- c(1,0,0,1,0,1,0,1,1,1,1,1,1,0,1)
x <- data.table(ID, Count1, Count2, Count3)
setkey(x, ID)

2 ответа

Решение

Ваши тестовые данные не соответствуют примеру, который вы дали, но независимо - вы можете воспользоваться тем, что data.table() имеет оператор по имени .SD для "подмножества данных. Так что это должно работать:

x[, lapply(.SD, sum), by = ID]
#----
     ID Count Count2 Count3
1:  210    13      5      5
2: 3917     5      5      5

Это на самом деле рассматривается в FAQ: тип vignette("datatable-faq", package="data.table") или найти его в Интернете.

Поскольку data.table является data.frame, вы можете использовать агрегат для этого:

> aggregate(. ~ ID, data=x, FUN=sum)
    ID Count1 Count2 Count3
1  210     13      5      5
2 3917      5      5      5
Другие вопросы по тегам