首页 > 解决方案 > 当列作为字符对象输入时,如何使用 tidyverse select?

问题描述

我正在尝试创建一个函数,该函数根据函数的输入选择列:

f <- function(string) {
  quosure <- quo(!!sym(string))
  dplyr::select(data, !!quosure)
}
temp <- f("id") # returns " Error in !quosure : invalid argument type"

奇怪的是,这个看起来非常相似的代码似乎可以工作。

g <- function(string) {
  quosure <- quo(!!sym(string))
  dplyr::pull(data, !!quosure)
}
temp <- g("id") # Works fine

第一个功能和第二个功能有什么区别,这意味着第一个功能失败而第二个功能有效?

标签: rdplyrtidyeval

解决方案


dplyr 版本“0.8.0.1”对我来说效果很好。

library(dplyr)
packageVersion("dplyr")
'0.8.0.1'

data <- data.frame(id= 1:10, othervariable= 11:20)
f <- function(string) {
  quosure <- quo(!!sym(string))
  dplyr::select(data, !!quosure)
}
temp <- f("id")
temp
id
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10

如果您需要从带有字符向量的数据框中选择(多个)列,我宁愿这样做

df <- data.frame(id= 1:10, othervariable= 11:20, x= 21:30)
f <- function(data, string) {
  data[ , string]
}
temp <- f(data= df, string= c("id", "x"))
temp
   id  x
1   1 21
2   2 22
3   3 23
4   4 24
5   5 25
6   6 26
7   7 27
8   8 28
9   9 29
10 10 30

推荐阅读