Mam formułę zawierającą pewne terminy i ramkę danych (dane wyjściowe z wcześniejszej rozmowy model.frame()
), która zawiera wszystkie te terminy i kilka innych. Chcę podzbiór ramki modelu, który zawiera tylko zmienne, które pojawiają się w formule.Wyodrębnij zmienne we wzorze z ramki danych
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)
Pożądany wynik jest fr
minus kolumna z
(fr[,1:4]
oszukuje - Muszę programowe rozwiązanie ...)
Niektóre strategie, które nie praca:
fr[all.vars(ff)]
## Error in `[.data.frame`(fr, all.vars(ff)) : undefined columns selected
(ponieważ all.vars()
otrzymuje "Reaction"
, a nie 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
(ponieważ podział na +
nieoczekiwanie dzieli termin log(1+Days)
).
Myślałam o schodził z drzewa składniowy o wzorze:
ff[[3]] ## log(1 + Days) + x + y
ff[[3]][[1]] ## `+`
ff[[3]][[2]] ## log(1 + Days) + x
ale nie mam rozwiązanie ułożyła, a wydaje się, że jadę w dół króliczej nory. Pomysły?
Wydaje się, że główną zmienną, która powoduje problemy, jest 'log (1 + Days)'. Czy musisz to tak nazwać, czy możesz użyć innej nazwy? – Thomas
Co z 'attr (terms.formula (ff)," term.labels ")'? –
Próbuję wymyślić ogólne rozwiązanie. Dlatego wszystko, co może pojawić się w "modelu".frame() 'wygenerowany z formuły prawnej musi być traktowany. To część problemu. –