【问题标题】:using variable column names in dplyr summarise在 dplyr 中使用变量列名汇总
【发布时间】:2019-01-27 09:47:04
【问题描述】:

我发现这个问题已经问过了,但没有正确的答案。 R using variable column names in summarise function in 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))

使用可变列,它不起作用

df %>% summarise(mean(x[1]) - mean(x[2]))
df %>% summarise(mean(as.name(x[1])) - mean(as.name(x[2])))

由于这个问题在 3 年前就已经被问过了,而且 dplyr 正在良好的发展中,我想知道现在是否有答案。

【问题讨论】:

  • x 有两个列名,所以是的,两个字符串。
  • 你可以使用get:df %&gt;% summarise(mean(get(x[1])) - mean(get(x[2])))
  • 哇,有帮助!随意张贴作为答案!为什么没有记录在案?我期待as.name 工作。

标签: r dplyr


【解决方案1】:

你可以使用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

get默认会在当前环境中搜索。

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

class(as.name("a")) # [1] "name"

你可以评估你的名字,这也可以:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 2018-10-22
    • 2020-01-26
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多