#r #mean #summary #dplyr #r-faq
#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:
Вы можете сделать это в 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]
Ответ №2:
Взгляните на 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)
Ответ №3:
Одним из вариантов является использование 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
Ответ №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