【问题标题】:Extract information inside parentheses of formula提取公式括号内的信息
【发布时间】:2020-01-25 23:24:00
【问题描述】:

我正在编写一个 R 包,用户在其中编写如下所示的公式:

outcome ~ var1 + var2 + mm(id, mmc(var3, var4), mmw(pupils^exp(teacher*b)))

右侧包括变量名称和元素 mm(),它本身包含变量名称 (id) 和元素 mmc() 和 mmw()。

我想将 mm()、mmc()、mmw() 分开,即以变量结尾

mm  = id, mmc(var3, var4), mmw(pupils^exp(teacher*b))
mmc = var3, var4
mmw = pupils^exp(teacher*b)

我唯一的选择是将公式解析为字符,然后使用正则表达式来分隔元素,还是有办法更优雅地处理它,因为它是一个公式?

我试过了

all.vars
all.names

但是由于 mmw() 通常包含非线性函数关系,因此它们分解 mmw() 太多了

【问题讨论】:

标签: r regex expression formula extract


【解决方案1】:

1) 使用Terms of a sum in a R expression中的getTerms,我们可以直接解析公式,无需使用正则表达式。首先我们得到术语tt,然后形成mm,这是具有多个元素的术语。从中提取其他人。没有使用任何包。

fo <- outcome ~ var1 + var2 + mm(id, mmc(var3, var4), mmw(pupils^exp(teacher * b)))

tt <- getTerms(fo[[3]])
mm <- as.list(tt[lengths(tt) > 1][[1]])[-1]
mmc <- as.list(mm[[2]][-1])
mmw <- as.list(mm[[3]][-1])

给予:

> mm
[[1]]
id

[[2]]
mmc(var3, var4)

[[3]]
mmw(pupils^exp(teacher * b))

> mmc
[[1]]
var3

[[2]]
var4

> mmw
[[1]]
pupils^exp(teacher * b)

2) 或者,我们可以将处理权合并到getTerms 中,提供getMs,如下所示:

getMs <- function(e, x = list()) {
  if (length(e) == 1) x
  else if (identical(e[[1]], as.name("+")))
    c( Recall(e[[2]], x), Recall(e[[3]], x) )
  else if (as.character(e[[1]]) %in% c("mm", "mmw", "mmc")) {
      for(i in 2:length(e)) x <- Recall(e[[i]], x)
      c(setNames(list(as.list(e[-1])), as.character(e[[1]])), x)
  } else x
}
res <- getMs(fo[[3]])
str(res)

给予:

List of 3
 $ mm :List of 3
  ..$ : symbol id
  ..$ : language mmc(var3, var4)
  ..$ : language mmw(pupils^exp(teacher * b))
 $ mmw:List of 1
  ..$ : language pupils^exp(teacher * b)
 $ mmc:List of 2
  ..$ : symbol var3
  ..$ : symbol var4

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2019-05-14
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多