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

Я хочу вычислить 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

person Mike    schedule 19.05.2011    source источник


Ответы (4)


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

Взгляните на функцию 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)
person Henrico    schedule 19.05.2011

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

Вот еще один вариант использования базовых функций 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
person Greg    schedule 19.05.2011