Вычислить групповое среднее, сумму или другую итоговую статистику. и присвоить столбец исходным данным

#r #mean #summary #dplyr #r-faq

#r #среднее #Краткие сведения #dplyr #r-faq

Вопрос:

Я хочу рассчитать mean (или любой другой сводной статистики длины, например min , max , length , sum ) в числовую переменную («значение») в пределах каждого уровня группировки переменных («группа»).

Итоговая статистика должна быть присвоена новой переменной, которая имеет ту же длину, что и исходные данные. То есть каждая строка исходных данных должна иметь значение, соответствующее текущему значению группы — набор данных не следует сворачивать до одной строки на группу. Например, рассмотрим группу mean :

Перед

 id  group  value
1   a      10
2   a      20
3   b      100
4   b      200
  

После

 id  group  value  grp.mean.values
1   a      10     15
2   a      20     15
3   b      100    150
4   b      200    150
  

Ответ №1:

Вы можете сделать это в dplyr использовании mutate :

 library(dplyr)
df %>%
  group_by(group) %>%
  mutate(grp.mean.values = mean(value))
  

…или используйте data.table для присвоения нового столбца по ссылке ( := ):

 library(data.table)
setDT(df)[ , grp.mean.values := mean(value), by = group]
  

Ответ №2:

Взгляните на ave функцию. Что-то вроде

 df$grp.mean.values <- ave(df$value, df$group)
  

Если вы хотите использовать ave для вычисления чего-то еще для каждой группы, вам нужно указать FUN = your-desired-function , например FUN = min :

 df$grp.min <- ave(df$value, df$group, FUN = min)
  

Ответ №3:

Одним из вариантов является использование plyr . ddply ожидает data.frame (первый d) и возвращает data.frame (второй d). Другие функции XXply работают аналогичным образом; т.е. ldply ожидает list и возвращает data.frame , dlply делает обратное … и так далее, и тому подобное. Вторым аргументом является группирующая переменная (ы). Третий аргумент — это функция, которую мы хотим вычислить для каждой группы.

 require(plyr)
ddply(dat, "group", transform, grp.mean.values = mean(value))

  id group value grp.mean.values
1  1     a    10              15
2  2     a    20              15
3  3     b   100             150
4  4     b   200             150
  

Ответ №4:

Вот еще один вариант, использующий базовые функции aggregate и merge :

 merge(x, aggregate(value ~ group, data = x, mean), 
     by = "group", suffixes = c("", "mean"))

  group id value.x value.y
1     a  1      10      15
2     a  2      20      15
3     b  3     100     150
4     b  4     200     150
  

Вы можете получить «лучшие» имена столбцов с помощью suffixes :

 merge(x, aggregate(value ~ group, data = x, mean), 
     by = "group", suffixes = c("", ".mean"))


  group id value value.mean
1     a  1    10         15
2     a  2    20         15
3     b  3   100        150
4     b  4   200        150