繁体   English   中英

如何从R表达式提取变量以在data.frame上下文中求值

[英]How can I extract variables from a R expression to be evaluated in data.frame context

我有一些character表达式,应该在data.table评估(不重要,只是上下文)。 为了确保所有必需的列都存在,我想在R表达式中提取所述列。

我想要的是:

library(data.table)
DT <- data.table(p001=rnorm(10),p002=rnorm(10),p003=rnorm(10))
expr <- 'p001+mean(p001,na.rm=TRUE)-weighted.mean(p002,w=p003)+someRandomOtherColumn'

# DT[,test:=p001+mean(p001,na.rm=TRUE)-weighted.mean(p002,w=p003)+someRandomOtherColumn]
# would fail as p004 is not in the columns

基本上,我正在寻找一种将从expr p001,p002,p003,someRandomOtherColumn提取的方法(可能是正则表达式)。

我对此的看法:我的看法是,我应该能够使用一些正则表达式捕获p001,p001,TRUE,p002,p003,someRandomOtherColumn ,这些正则表达式将捕获f(,) ,然后过滤“允许的”列名( TRUE不在那种情况下)。

嵌套的f(,,)并不是问题,因为我可以递归调用同一函数,嵌套的f(,(),)也很好。

我所拥有的:从现在开始这就是我所拥有的,可以使它正常工作,但是感觉很糟糕

expr <- 'p001+mean(p001,na.rm=TRUE)-weighted.mean(p002,w=p003)+someRandomOtherColumn'
clean <- function(string) gsub(string, pattern='[_|\\.|a-zA-z]+\\(([^)]*)\\)', replacement='\\1', perl=TRUE)
clean(expr)
[1] "p001+p001,na.rm=TRUE-p002,w=p003+someRandomOtherColumn"
# Then I can remove =* than split on ,|+|-|*

在表达式中添加~ ,可以创建一个有效的R公式表达式:

expr <- '~ p001+mean(p001,na.rm=TRUE)-weighted.mean(p002,w=p003)+someRandomOtherColumn'

该字符串可以使用as.formula转换为公式。 之后,可以使用all.vars提取变量名称:

all.vars(as.formula(expr))
# [1] "p001"             "p002"             "p003"             "someRandomOtherColumn"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM