Суммирование данных на основе столбца в R

Я новичок в R, и у меня есть набор данных, который выглядит следующим образом (фактические данные 10K на 5K, поэтому мне действительно нужен короткий путь):

Cluster    Item1   Item2    Item 3

 1           1      2         2
 1           3      1         1
 1           1      3         0 
 2           3      2         0  
 2           0      0         2 
 2           4      2         2
 3           0      1         1  
 3           1      1         2

Я хочу добавить столбцы каждого набора данных по кластеру, чтобы он выглядел так:

Cluster    Item1   Item2    Item 3

    1        5      6         3
    2        7      4         4
    3        1      2         3 

Я хочу суммировать их по определенной колонке. Спасибо заранее.

4 ответа

Ты можешь использовать aggregate (dat имя вашего фрейма данных):

aggregate(dat[-1], dat["Cluster"], sum)

#   Cluster Item1 Item2 Item3
# 1       1     5     6     3
# 2       2     7     4     4
# 3       3     1     2     3

С data.table:

library(data.table)
setDT(dat)[ , lapply(.SD, sum), by = Cluster]
#    Cluster Item1 Item2 Item3
# 1:       1     5     6     3
# 2:       2     7     4     4
# 3:       3     1     2     3

С dplyr:

dat %>%
  group_by(Cluster) %>%
  summarise_each(funs(sum))
#   Cluster Item1 Item2 Item3
# 1       1     5     6     3
# 2       2     7     4     4
# 3       3     1     2     3

Спасибо за ваш ответ, я тоже использовал это хорошо, и он работал отлично:

 aggregate(. ~ Cluster, data=dat, FUN=sum)



#   Cluster Item1 Item2 Item3
# 1       1     5     6     3
# 2       2     7     4     4
# 3       3     1     2     3

Пытаться:

> sapply(ddf[-1], function(x) tapply(x,ddf$Cluster,sum))
  Item1 Item2 Item3
1     5     6     3
2     7     4     4
3     1     2     3

Если вы хотите суммировать все варианты, кроме группировки, используйте across в dplyr

      df <- read.table(text = "Cluster    Item1   Item2   Item3
1   1   2   2
1   3   1   1
1   1   3   0
2   3   2   0
2   0   0   2
2   4   2   2
3   0   1   1
3   1   1   2", header = T)

df %>% group_by(Cluster) %>% summarise(across(everything(), ~sum(.)))

# A tibble: 3 x 4
  Cluster Item1 Item2 Item3
    <int> <int> <int> <int>
1       1     5     6     3
2       2     7     4     4
3       3     1     2     3
Другие вопросы по тегам