【问题标题】:R use string to refer to columnR使用字符串来引用列
【发布时间】:2015-04-29 22:27:19
【问题描述】:

我想通过引用带有字符串的列来对数据框进行子集化,并选择满足条件的该列的值。 从下面的代码

 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 是字符类型,但我需要的是某种“列名对象”。使用 as.name(salary_string) 也不起作用。 我知道我可以通过使用得到子集

set <- subset(employ.data, salary > 23000)

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

【问题讨论】:

  • 想解释一下您要达到的目标背后的基本原理吗?
  • 我正在创建一个将字符串/字符作为输入的函数,如果输入与列名匹配,则该函数应创建满足条件的列值的子集
  • 一个丑陋的选择:subset(employ.data,eval(parse(text=salary_string)) &gt; 23000)
  • @Frank 几乎同时发表了相同的评论;)
  • @Simon,知道了。它让我练习使用 dplyr 编写函数。让我知道是否需要任何提示

标签: r string subset


【解决方案1】:

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

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

【讨论】:

  • 更短的employ.data[employ.data["salary"]&gt;23000,]
  • 是的,但如果我没记错的话,我认为他想直接使用变量而不是字符串。
  • 顺便说一句:这是解释为什么使用[ 而不是subset 更好的帖子。 stackoverflow.com/questions/9860090/…
【解决方案2】:

这是另一个想法:

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

【讨论】:

    【解决方案3】:

    为了展示如何使用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)
    

    【讨论】:

    • 另一种我强烈反对使用的 hacky 方式 ;) subset(employ.data,eval(parse(text=paste0(salary_string,"&gt;","23000"))))
    • 为什么不subset(employ.data, eval(as.name(salary_string)) &gt; 23000)?
    • 是的,@StevenBeaupré!我有点生疏了。离开电网有一段时间了:)
    • 再一次,我认为subset 和eval 的示例如果您想尝试解析,那么这些示例是不错的,但不应该在生产代码中使用。你会遇到各种各样的麻烦。谁知道 R 在评估 subset 参数时在幕后真正做了什么?至少我没有。
    猜你喜欢
    • 2019-06-24
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2012-05-22
    • 2021-02-05
    相关资源
    最近更新 更多