从数据框中提取公式中的变量

Ben*_*ker 13 r formula

我有一个公式,其中包含一些术语和一个数据框(早期model.frame()调用的输出),其中包含所有这些术语等等.我想要模型框架的子集,其中只包含公式中出现的变量.

ff <- log(Reaction) ~ log(1+Days) + x + y
fr <- data.frame(`log(Reaction)`=1:4,
                 `log(1+Days)`=1:4,
                 x=1:4,
                 y=1:4,
                 z=1:4,
                 check.names=FALSE)
Run Code Online (Sandbox Code Playgroud)

期望的结果是fr减去z列(fr[,1:4]是作弊 - 我需要一个程序化的解决方案......)

一些策略,工作:

fr[all.vars(ff)]
## Error in `[.data.frame`(fr, all.vars(ff)) : undefined columns selected
Run Code Online (Sandbox Code Playgroud)

(因为all.vars()得到"Reaction",不是log("Reaction"))

stripwhite <- function(x) gsub("(^ +| +$)","",x)
vars <- stripwhite(unlist(strsplit(as.character(ff)[-1],"\\+")))
fr[vars]
## Error in `[.data.frame`(fr, vars) : undefined columns selected
Run Code Online (Sandbox Code Playgroud)

(因为分裂是+虚假的分裂log(1+Days)术语).

我一直在考虑走下公式的解析树:

ff[[3]]       ## log(1 + Days) + x + y
ff[[3]][[1]]  ## `+`
ff[[3]][[2]]  ## log(1 + Days) + x
Run Code Online (Sandbox Code Playgroud)

但我没有把解决方案放在一起,似乎我要走下一个兔子洞.想法?

Tho*_*mas 4

这应该有效:

\n\n
> fr[gsub(" ","",rownames(attr(terms.formula(ff), "factors")))]\n  log(Reaction) log(1+Days) x y\n1             1           1 1 1\n2             2           2 2 2\n3             3           3 3 3\n4             4           4 4 4\n
Run Code Online (Sandbox Code Playgroud)\n\n

感谢 Roman Lu\xc5\xa1trik 为我指明了正确的方向。

\n\n

编辑:看起来您也可以将其从“变量”属性中取出:

\n\n
fr[gsub(" ","",attr(terms(ff),"variables")[-1])]\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑2:找到第一个问题案例,涉及I()offset()

\n\n
ff <- I(log(Reaction)) ~ I(log(1+Days)) + x + y\nfr[gsub(" ","",attr(terms(ff),"variables")[-1])]\n
Run Code Online (Sandbox Code Playgroud)\n\n

不过,使用正则表达式很容易纠正这些问题。但是,如果您遇到类似问题中调用变量的情况,例如,并在公式中与for variablelog(x)之类的内容一起使用,这将变得非常混乱。I(log(y))y

\n