Используйте функцию в groupby с переменным именем столбца в R, используя dplyr

У меня есть кадр данных:

df <- data.frame(Category = c(rep("A", 3), rep("B", 3)), Value = rnorm(6))
df
 Category       Value
1        A -0.94968814
2        A  2.56687061
3        A -0.15665153
4        B -0.47647105
5        B  0.83015076
6        B -0.03744522

Теперь я хочу добавить еще один столбец, который является средним значением для каждой категории. Это можно сделать с помощью пакета dplyr очень просто:

df %>% group_by(Category) %>% 
  summarize(mean = mean(Value))

Теперь в части кода моя проблема: я не могу использовать mean(Value), но у меня есть имя переменной, которое знает имя столбца: columnName = "Value" Но это, к сожалению, не сработает:

columnName = "Value"

df %>% group_by(Category) %>% 
  summarize(mean = mean(columnName))

Предупреждающие сообщения: 1: В mean.default("Value") : аргумент не является числовым или логическим: возвращается NA 2: В mean.default("Value") :
аргумент не является числовым или логическим: возвращается NA

Как я могу передать имя столбца с переменной?


person user2874583    schedule 21.12.2016    source источник
comment
mean(df[,columnName]) этот код работал у меня при использовании тех же переменных, что и вы.   -  person Benjamin Mohn    schedule 21.12.2016
comment
Нет, это не работает. Это должно быть среднее значение групп, а не среднее значение столбца.   -  person user2874583    schedule 21.12.2016
comment
Он не использует пакет dplyr, но работает так: tapply(df[,columnName],df$Category, mean)   -  person Benjamin Mohn    schedule 21.12.2016
comment
используйте set.seed при использовании таких функций, как rnorm, для создания фреймов данных, чтобы мы могли перепроверить результаты.   -  person Sotos    schedule 21.12.2016
comment
Это называется стандартной оценкой. На SO есть сотни обманов по этому поводу. Пожалуйста, прочтите vignette("nse"). Один из способов добиться этого — library(lazyeval) ; dots <- interp(~ mean(columnName), columnName = as.name("Value")) ; df %>% group_by(Category) %>% summarise_(.dots = dots)   -  person David Arenburg    schedule 21.12.2016
comment
См. также эту stackoverflow.com/questions/26724124/   -  person David Arenburg    schedule 21.12.2016


Ответы (1)


Мы можем использовать get с aggregate

aggregate(get(columnName)~Category, df, mean)

#    Category get(columnName)
#1        A      -0.5490751
#2        B      -0.2594670
person Ronak Shah    schedule 21.12.2016
comment
Это работает спасибо! Но я искал решение в пакете dplyr. Вы знаете, возможно ли это тоже? - person user2874583; 21.12.2016