У меня есть формула, содержащая некоторые термины и кадр данных (вывод более раннего вызова 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
но у меня нет решения, и кажется, что я иду по кроличьей дыре. Идеи?