2014-04-21 10 views
6

Załóżmy, że mam formuł R z przypadkowych warunkach:Jak uchwycić ustalone warunki formuły R?

f1<-formula(y~x1+x2+(1|x3)+x1*x4) 
f2<-formula(y~x1+x2+(1|x3+(0+x5|x3))+x1*x4) 

jak mogłem po prostu stałe warunki tych wzorach takie, że:

fixterm 
[1] "x1" "x2" "x4" "x1:x4" 

Odpowiedz

4
library(lme4) 
f1.fixed <- terms(lme4:::nobars(f1)) 
attr(f1.fixed, "term.labels") 
#[1] "x1" "x2" "x4" "x1:x4" 
4

To nie jest dokładnie to, czego szukasz, ale może to być przydatne:

> attr(terms(f1),"term.labels") 
[1] "x1"  "x2"  "1 | x3" "x4"  "x1:x4" 
> attr(terms(f2),"term.labels") 
[1] "x1"      "x2"      "1 | x3 + (0 + x5 | x3)" 
[4] "x4"      "x1:x4" 

z drugiej strony, jeśli chcesz dostać tylko nazwy zmiennych, można deparse wzór ręcznie:

reclapply <- function(x) { 
    if (is.name(x)) as.character(x) 
    else if (is.atomic(x)) NULL # ignore 
    else lapply(2:length(x), # omit function name - 1st element 
     function(i) reclapply(x[[i]])) 
} 

unique(unlist(reclapply(f1[[3]]))) 
## [1] "x1" "x2" "x3" "x4" 

unique(unlist(reclapply(f2[[3]]))) 
## [1] "x1" "x2" "x3" "x5" "x4" 

To daje prawie taki sam wynik jak

all.vars(f1) 
## [1] "y" "x1" "x2" "x3" "x4" 
all.vars(f2) 
## [1] "y" "x1" "x2" "x3" "x5" "x4" 

ale zapewnia Ci podpowiedź, w jaki sposób uzyskać dostęp do kilka ciekawych informacji na obiekcie formuły.

+1

Możliwe, że po prostu "grep" nie będzie ustalonych warunków. –

2

Wygląda na to, że możemy uzyskać unikalne warunki, używając grep, aby usunąć niepowiązane terminy. Wynikiem unique(ft) przedstawia ustalone warunki, które są unikalne dla zarównof1 i f2

> ft <- unlist(lapply(c(f1, f2), function(x){ 
     grep("\\|", attr(terms(x), "term.labels"), invert = TRUE, value = TRUE) 
    })) 
> unique(ft) 
## [1] "x1" "x2" "x4" "x1:x4" 
+0

Chciałbym przegłosować tę odpowiedź, ale osiągnąłem mój dzienny limit. :) – gagolews

1

Najprostszym sposobem na to jest użycie pakietu lme4:

# require(lme4) 
f1 <- formula(y~x1+x2+(1|x3)+x1*x4) 
f2 <- formula(y~x1+x2+(1|x3+(0+x5|x3))+x1*x4) 

# extracting random terms 
findbars(f1); findbars(f2) 

# [[1]] 
# 1 | x3 
# [[1]] 
# 1 | x3 + (0 + x5 | x3) 

# extracting fixed terms 
nobars(f1); nobars(f2) 

# y ~ x1 + x2 + x1 * x4 
# y ~ x1 + x2 + x1 * x4 

a ty można to zrobić przy pomocy zaledwie jednego kodu! :-)

Powiązane problemy