2016-03-20 25 views
3
trennt

Ich musste vor kurzem einige Daten basierend auf einer Interaktion von Faktoren grafisch darstellen, und ich fand es schwieriger als ich fühlte, dass dieser gemeinsame in R sein sollte. Ich vermute, dass ich etwas vermisse. Nehmen wir an, ich habe einen Vektor von 30 Zahlen zusammen mit einem Paar von Faktoren.Wie man Faktorinteraktionen in R

n <- runif(30, min=0, max=10) 
a <- gl(2, 1, 30) 
b <- gl(6, 2, 30) 

Und ich möchte das Mittel für jede Kombination von Faktoren.

y <- tapply(n, a:b, mean) 

Jetzt möchte ich ein Gitter xyplot verwenden, um diese Mittel zu planen, wo ich eine Platte für jede der beiden Werte von a haben. Die Mittelwerte sind die y Werte und die b Faktoren sind die x Werte. Die Aktie xyplot Formel wäre so etwas wie

xyplot(y ~ b | a, data=mydf) 

, wo mydf ist ein Datenrahmen mit Spalten y, b, und a, die von tapply oben berechnet wurden. Aber mein Problem ist, wie man die interagierenden Faktoren entwirrt. Das habe ich getan.

factorSplit <- strsplit(names(y), ":") 
a1 <- sapply(factorSplit, function(x) {x[1]}) 
b1 <- sapply(factorSplit, function(x) {x[2]}) 
mydf <- data.frame(y, b1, a1) 

Jetzt mydf hat

> mydf 
      y b1 a1 
1:1 3.856797 1 1 
1:2 3.487181 2 1 
1:3 8.411425 3 1 
1:4 3.757709 4 1 
1:5 4.982970 5 1 
1:6 6.480346 6 1 
2:1 2.778864 1 2 
2:2 4.390511 2 2 
2:3 7.119926 3 2 
2:4 4.707945 4 2 
2:5 5.546894 5 2 
2:6 8.984631 6 2 

und ich kann mit

xyplot(y ~ b1 | a1, mydf, layout=c(1,2)) 

plotten Aber ich fühle mich dieses Geschäft mit strsplit von names(y) und dann sapply ist übertrieben. Es scheint, dass es eine direktere Methode geben sollte, um eine Faktorinteraktion wiederherzustellen, die mit tapply erstellt wurde.

+4

Da Sie Ihre 'a' und 'b' Spalten zu erhalten, ist es besser' aggregate' hier zu verwenden, als 'tapply':' y <- Aggregat (n ~ a + b, NULL, bedeuten) ' – MrFlick

+0

' Aggregat' ist ziemlich nett. Wenn die Basisgruppierung jedoch zu verwirrend wird, wende ich mich normalerweise an 'dplyr', was es ziemlich einfach macht. In diesem Fall 'data_frame (n, a, b)%>% group_by (a, b)%>% zusammenfassen (y = mean (n))' – alistaire

+0

Anstatt die Frage mit einer Lösung zu aktualisieren, sollten Sie sie als eine Antwort unten (es ist in Ordnung, Ihre eigenen Fragen zu beantworten), weil auf diese Weise die Frage nicht mehr unbeantwortet bleibt. – MrFlick

Antwort

0

Die Aggregat Funktion ist genau das, was mein Verständnis fehlte. Wie in den Kommentaren erwähnt, ein Anruf zu Aggregat tut alles, was ich früher durchgestoßen war.

> x <- aggregate(n ~ a+b, NULL, mean) 
> head(x) 
    a b  n 
1 1 1 2.967073 
2 2 1 3.001279 
3 1 2 3.867564 
4 2 2 1.076378 
5 1 3 2.805827 
6 2 3 6.275858 
> dim(x) 
[1] 12 3 
>