Рассчитать среднее по группе (или другую сводную статистику) и присвоить исходным данным - PullRequest
18 голосов
/ 19 мая 2011

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

Ответы [ 4 ]

18 голосов
/ 19 мая 2011

Посмотрите на функцию 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)
17 голосов
/ 23 февраля 2016

Вы можете сделать это в 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]
7 голосов
/ 19 мая 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
3 голосов
/ 19 мая 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
...