Агрегатная функция в R, использующая номера индексов столбцов, а не имена

#r #aggregate

Вопрос:

Я хочу использовать агрегатную функцию в R, используя номера индексов столбцов для идентификации агрегируемых столбцов фрейма данных, а не имен столбцов.

Вот пример, который работает с использованием имен столбцов:

 df = data.frame(A = c("a", "a", "b", "b", "c", "c"), B = 1:3, C = 1:3, D = 1:3)
aggregate(cbind(B, C, D) ~ A, data = df, sum)
 

Но вместо того, чтобы перечислять B, C и D в cbind, я хочу проинструктировать его использовать столбцы 2:4.

Комментарии:

1. вам нужно уменьшить количество колов в group_by, тогда вы также можете сделать df %>% group_by(A) %>% summarise(across(1:3, sum)) это в dplyr

Ответ №1:

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

 aggregate(. ~ A, data = df, sum)
  A B C D
1 a 3 3 3
2 b 4 4 4
3 c 5 5 5
 

Или, если нам нужен конкретный индекс позиции, подмножество данных и преобразование в matrix

 aggregate(as.matrix(df[2:4]) ~ A, data = df, sum)
A B C D
1 a 3 3 3
2 b 4 4 4
3 c 5 5 5
 

Или с помощью dplyr

 library(dplyr)
df %>%
     group_by(A) %>%
     summarise(across(all_of(names(.)[2:4]), sum))
 

Ответ №2:

Другим способом использования номеров столбцов было бы

 aggregate(df[2:4], list(grp = df[[1]]), sum)
#Or using df$A
#aggregate(df[2:4], list(grp = df$A), sum)

#  grp B C D
#1   a 3 3 3
#2   b 4 4 4
#3   c 5 5 5