Суммировать по столбцу: среднее и сумма - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь составить список переменных по группам. Некоторые переменные должны быть суммированы, а другие должны быть усреднены.

У меня есть это:

Group    Variable1     Variable2
1        10            2
1        12            6
2        6             7
2        4             9

Я хотел бы получить сумму переменной 1 и среднее значение переменной 2:

Group    Variable1     Variable2
1        22            4
2        10            8

Я использовал dplyr для получения суммы группы:

sum <- (df %>% 
  group_by(Group) %>% 
  summarise_all(funs(sum)))

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

Спасибо!

Ответы [ 4 ]

3 голосов
/ 12 марта 2020

В версии dplyr для разработчиков возможно выборочное применение различных функций к различным наборам переменных с across

library(dplyr)
df %>%
   group_by(Group) %>%
   summarise(across(Variable1:Variable2, sum), across(Variable3:Variable5, mean))
# A tibble: 2 x 6
#  Group Variable1 Variable2 Variable3 Variable4 Variable5
#  <int>     <int>     <int>     <dbl>     <dbl>     <dbl>
#1     1        22         8      18.5         5      24  
#2     2        10        16      11           7      20.5

данными

df <- structure(list(Group = c(1L, 1L, 2L, 2L), Variable1 = c(10L, 
12L, 6L, 4L), Variable2 = c(2L, 6L, 7L, 9L), Variable3 = c(24L, 
13L, 10L, 12L), Variable4 = c(3L, 7L, 9L, 5L), Variable5 = c(26L, 
22L, 23L, 18L)), class = "data.frame", row.names = c(NA, -4L))
2 голосов
/ 12 марта 2020

Пример данных с большим количеством столбцов:

df <- structure(list(Group = c(1L, 1L, 2L, 2L), Variable1 = c(10L, 
12L, 6L, 4L), Variable2 = c(2L, 6L, 7L, 9L), Variable3 = c(9L, 
8L, 10L, 2L), Variable4 = c(8L, 7L, 9L, 5L)), row.names = c(NA, 
-4L), class = "data.frame")

#    Group Variable1 Variable2 Variable3 Variable4
# 1:     1        10         2         9         8
# 2:     1        12         6         8         7
# 3:     2         6         7        10         9
# 4:     2         4         9         2         5

Создание векторов имен переменных и использование mget + lapply в data.table

library(data.table)
setDT(df)

df[, c(lapply(mget(paste0('Variable', 1:2)), sum), 
       lapply(mget(paste0('Variable', 3:4)), mean)),
   by = Group]

#    Group Variable1 Variable2 Variable3 Variable4
# 1:     1        22         8       8.5       7.5
# 2:     2        10        16       6.0       7.0
1 голос
/ 12 марта 2020

Вот базовое решение R с использованием merge + aggregate, то есть

dfout <- merge(aggregate(Variable1~Group,df,sum),
               aggregate(Variable2~Group,df,mean))

, такое что

> dfout
  Group Variable1 Variable2
1     1        22         4
2     2        10         8

DATA

df <- structure(list(Group = c(1L, 1L, 2L, 2L), Variable1 = c(10L, 
12L, 6L, 4L), Variable2 = c(2L, 6L, 7L, 9L)), class = "data.frame", row.names = c(NA, 
-4L))
0 голосов
/ 13 марта 2020

Мы можем использовать mutate_at, чтобы применить функции к нескольким столбцам, а затем выбрать 1-ую строку в каждой группе, чтобы получить суммарные значения.

library(dplyr)

df %>%
  group_by(Group) %>%
  mutate_at(vars(Variable1:Variable2), sum) %>%
  mutate_at(vars(Variable3:Variable4), mean) %>%
  slice(1L)

#  Group Variable1 Variable2 Variable3 Variable4
#  <int>     <int>     <int>     <dbl>     <dbl>
#1     1        22         8       8.5       7.5
#2     2        10        16       6         7  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...