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.
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
' 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
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