在数据框的上下文中评估操作
Evaluate an operation in a dataframe's context
我正在使用包中的公式,我想删除所有 non-numeric 项。
我的问题是,由于基本公式可能包含运算,我无法直接计算某些项。
这是一个代表:
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 我宁愿避免使用它。
有没有办法在数据帧的上下文中评估操作,以便我可以测试结果是否为数字?
注意:我不确定我的标题应该是关于评估或公式术语删除的,请随时提出修改建议。
一种选择是使用 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
使用tidyverse
library(purrr)
library(rlang)
map_lgl(parse_exprs(op), ~ eval_tidy(.x, data = datax) %>%
is.numeric)
#[1] TRUE TRUE FALSE
我正在使用包中的公式,我想删除所有 non-numeric 项。
我的问题是,由于基本公式可能包含运算,我无法直接计算某些项。
这是一个代表:
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 我宁愿避免使用它。
有没有办法在数据帧的上下文中评估操作,以便我可以测试结果是否为数字?
注意:我不确定我的标题应该是关于评估或公式术语删除的,请随时提出修改建议。
一种选择是使用 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
使用tidyverse
library(purrr)
library(rlang)
map_lgl(parse_exprs(op), ~ eval_tidy(.x, data = datax) %>%
is.numeric)
#[1] TRUE TRUE FALSE