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

#r #dplyr

#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:

Взгляните на 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)
 

Ответ №2:

Вы можете сделать это с 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]
 

Ответ №3:

Один из вариантов — использовать plyr . ddply ожидает a data.frame (первый d) и возвращает a data.frame (второй d). Другие функции XXply работают аналогичным образом; т. Е. ldply Ожидает a list и возвращает a 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