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