我有一个公式,其中包含一些条款和一个数据框(以前的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
,但我还没有得到一个解决方案放在一起,并且好像我要下去一个兔子洞。想法?
似乎是造成你的问题的主要变量是'log(1 + Days)'。你必须这么称呼吗?或者你可以用一个不同的名字吗? – Thomas
attr(terms.formula(ff),“term.labels”)'? –
我试图想出一个通用的解决方案。因此,任何可能出现在模型中的东西。必须处理由法定公式生成的frame()'。这是问题的一部分。 –