Рассчитать среднее значение группы (или другую итоговую статистику) и присвоить исходные данные

Я хочу рассчитать 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

Один из вариантов - использовать 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

Ответ 3

Вы также можете сделать это в dplyr:

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]

Ответ 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