我有一个公式,其中包含一些术语和一个数据框(早期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)
期望的结果是fr
减去z
列(fr[,1:4]
作弊 - 我需要一个程序解决方案......)
一些不起作用的策略:
fr[all.vars(ff)]
## Error in `[.data.frame`(fr, all.vars(ff)) : undefined columns selected
(因为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
(因为分裂+
虚假地分裂了这个log(1+Days)
词)。
我一直在考虑沿着公式的解析树走下去:
ff[[3]] ## log(1 + Days) + x + y
ff[[3]][[1]] ## `+`
ff[[3]][[2]] ## log(1 + Days) + x
但我还没有一个解决方案,而且我好像要掉进兔子洞了。想法?