使用dplyr在R中,如何在groupby中使用变量列名来调用函数?

3

I have a dataframe:

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: In mean.default("Value") : 参数不是数值或逻辑型: 返回NA 2: In mean.default("Value") :
参数不是数值或逻辑型: 返回NA

我该如何使用变量传递列名?


mean(df[,columnName])这行代码在我使用与您相同的变量时起作用。 - Benjamin Mohn
1
不,那样行不通。必须是组的平均值,而不是列的平均值。 - user2874583
它没有使用dplyr包,但是它的工作方式如下:tapply(df[,columnName],df$Category, mean) - Benjamin Mohn
请在使用 rnorm 创建数据框时使用 set.seed 函数,以便我们可以双重检查结果。 - Sotos
2
这被称为标准评估(standard evaluation)。在SO上有成百上千的关于此问题的副本,请阅读vignette("nse")。实现此操作的一种方法是 library(lazyeval) ; dots <- interp(~ mean(columnName), columnName = as.name("Value")) ; df %>% group_by(Category) %>% summarise_(.dots = dots) - David Arenburg
请参见此链接:https://dev59.com/jF8d5IYBdhLWcg3wiSjI - David Arenburg
1个回答

2
我们可以在aggregate中使用get
aggregate(get(columnName)~Category, df, mean)

#    Category get(columnName)
#1        A      -0.5490751
#2        B      -0.2594670

1
这个有效,谢谢!但我在寻求在dplyr包内的解决方案。您知道是否也可能吗? - user2874583

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接