代码之家  ›  专栏  ›  技术社区  ›  statquant

如何从R表达式中提取要在数据中计算的变量。框架上下文

  •  -1
  • statquant  · 技术社区  · 8 年前

    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 回复  |  直到 8 年前
        1
  •  3
  •   Sven Hohenstein    8 年前

    当您添加 ~

    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"