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
我想通过引用带有字符串的列和 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