在dplyr汇总中使用变量列名

drm*_*iod 2 r dplyr

我发现这个问题已经问过但没有正确答案.R在dplyr中使用变量列名称汇总函数

我想计算两列意义之间的差异,但列名应该由变量提供......到目前为止,我发现只有函数as.name提供列名作为文本,但这在某种程度上不起作用...

使用修复列名称可以正常工作.

x <- c('a','b')
df <- group_by(data.frame(a=c(1,2,3,4), b=c(2,3,4,5), c=c(1,1,2,2)), c)
df %>% summarise(mean(a) - mean(b))
Run Code Online (Sandbox Code Playgroud)

对于可变列,它不起作用

df %>% summarise(mean(x[1]) - mean(x[2]))
df %>% summarise(mean(as.name(x[1])) - mean(as.name(x[2])))
Run Code Online (Sandbox Code Playgroud)

由于这已经在3年前问过并且dplyr处于良好的发展状态,我想知道现在是否有答案.

Moo*_*per 5

你可以使用base::get:

df %>% summarise(mean(get(x[1])) - mean(get(x[2])))

# # A tibble: 2 x 2
#        c `mean(a) - mean(b)`
#    <dbl>               <dbl>
# 1     1                  -1
# 2     2                  -1
Run Code Online (Sandbox Code Playgroud)

get 将默认搜索当前环境.

正如错误消息所示,mean需要一个逻辑或数字对象,as.name返回一个名称:

class(as.name("a")) # [1] "name"
Run Code Online (Sandbox Code Playgroud)

您可以评估您的姓名,这也可以使用:

df %>% summarise(mean(eval(as.name(x[1]))) - mean(eval(as.name(x[2]))))
# # A tibble: 2 x 2
#       c `mean(eval(as.name(x[1]))) - mean(eval(as.name(x[2])))`
#   <dbl>                                                   <dbl>
# 1     1                                                      -1
# 2     2                                                      -1
Run Code Online (Sandbox Code Playgroud)