如何从R表达式中提取要在data.frame上下文中计算的变量

时间:2017-08-25 07:20:45

标签: r regex data.table expression pcre

我在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 ,|+|-|*

1 个答案:

答案 0 :(得分:3)

向表达式添加~时,可以创建有效的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"