【问题标题】:Evaluate an operation in a dataframe's context评估数据框上下文中的操作
【发布时间】:2019-11-11 14:22:44
【问题描述】:

我正在处理包中的公式,我想删除所有非数字项。

我的问题是,由于基本公式可能包含运算,我无法直接评估某些术语。

这是一个代表:

datax=mtcars
op = c("mpg", "log(mpg)", "ifelse(mpg>2, '>2', '<=2')")
sapply(op, function(x){ is.numeric(datax[[x]]) })
#T,F,F
sapply(op, function(x){ is.numeric(with(data, get(x))) })
#Error in get(x) : object 'log(mpg)' not found

#Expected output:
#T,T,F

我知道我可以使用attach(datax),但这个功能非常适合not recommended,我宁愿避免使用它。

有没有办法在数据框的上下文中评估操作,以便我可以测试结果是否为数字?

注意:我不确定我的标题应该是关于评估或公式术语的删除,请随时提出修改建议。

【问题讨论】:

    标签: r formula expression-evaluation


    【解决方案1】:

    一种选择是使用eval(parse()),即

    sapply(op, function(i) {is.numeric(with(mtcars, eval(parse(text = i))))})
    
    #                       mpg                   log(mpg) ifelse(mpg>2, '>2', '<=2') 
    #                      TRUE                       TRUE                      FALSE 
    

    【讨论】:

      【解决方案2】:

      使用tidyverse

      library(purrr)
      library(rlang)
      map_lgl(parse_exprs(op), ~ eval_tidy(.x, data = datax) %>%
                    is.numeric)
      #[1]  TRUE  TRUE FALSE
      

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 2011-12-08
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多