R 使用字符串来引用列

R use string to refer to column

我想通过引用带有字符串的列和 select 满足条件的该列的值来对数据框进行子集化。 来自以下代码

 employee <- c('John Doe','Peter Gynn','Jolie Hope')
 salary <- c(21000, 23400, 26800)
 startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
 employ.data <- data.frame(employee, salary, startdate)
 salary_string <- "salary"

我想通过使用 salary_string 来引用列名来获得所有超过 23000 的薪水。

我试过没有成功:

set <- subset(employ.data, salary_string > 23000)
set2 <- employ.data[, employ.data$salary_string > 23000)

这似乎不起作用,因为 salary_string 是字符类型,但我需要的是某种 "column name object"。使用 as.name(salary_string) 也不起作用。 我知道我可以通过使用

获得子集
set <- subset(employ.data, salary > 23000)

但我的目标是使用类型为字符 (salary_string) 的列名,一次使用 subset(employ.data, ... ),一次使用 employ.data[ ...]

简短的回答是:不要使用 subset 但是 像

employ.data[employ.data[salary_string]>23000,]

为了展示如何使用 subset() 实现结果:

您遇到的问题是因为 subset() 使用了非标准评估。这是将字符串替换为 subset() 函数的一种方法。

## set up an unevaluated call
e <- call(">", as.name(salary_string), 23000)
## evaluate it in subset()
subset(employ.data, eval(e))
#     employee salary  startdate
# 2 Peter Gynn  23400 2008-03-25
# 3 Jolie Hope  26800 2007-03-14

或者如 Steven 所建议的,以下方法也很有效。

subset(employ.data, eval(as.name(salary_string)) > 23000)

这是另一个想法:

dplyr::filter(employ.data, get(salary_string) > 23000)

给出:

#    employee salary  startdate
#1 Peter Gynn  23400 2008-03-25
#2 Jolie Hope  26800 2007-03-14