Рассчитать среднее значение группы (или другую итоговую статистику) и присвоить исходные данные
Я хочу рассчитать 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