Sie können immer noch verwenden tapply
hier:
do.call(rbind,
tapply(seq_len(ncol(dat)),a1,
function(i)rowMeans(dat[,i])))
Frage
Entschuldigung, Leute, ich kann den Wald für die Bäume nicht sehen. Ich habe viel gesucht, konnte aber keine Lösung finden. Ich will, z. B. das Mittelwert für jede Einheit (möglicherweise die rowMeans
) einer Untergruppe von Variablen in einer Matrix (oder möglicherweise einem Datenrahmen) in R
. Ich möchte die Spalten mit einem Indizierungsvektor wie in auswählen tapply
, was ich rief a1
Im folgenden Beispiel.
> set.seed(23958)
> (dat <- matrix(sample(0:3, 10, replace = TRUE), ncol = 5))
[,1] [,2] [,3] [,4] [,5]
[1,] 2 3 0 2 1
[2,] 2 1 1 2 1
> set.seed(6112)
> (a1 <- sample(1:2, 5, replace = TRUE))
[1] 1 1 2 2 1
Die Lösung in diesem Beispiel sollte so aussehen, aber natürlich möchte ich es auf umfassendere Weise tun. Ich dachte, ich sollte eine Funktion von der verwenden apply
Familie, aber ich konnte nicht herausfinden, welches.
> cbind(rowMeans(dat[, a1 == 1]), rowMeans(dat[, a1 == 2]))
[,1] [,2]
[1,] 2.000000 1.0
[2,] 1.333333 1.5
Lösung
Sie können immer noch verwenden tapply
hier:
do.call(rbind,
tapply(seq_len(ncol(dat)),a1,
function(i)rowMeans(dat[,i])))
Andere Tipps
Wenn du t
Ransponieren Sie Ihre Daten, Sie können verwenden by
:
t(do.call(rbind,by(t(dat),a1,colMeans)))
1 2
V1 2.000000 1.0
V2 1.333333 1.5
Sie könnten auch die verwenden aggregate
Funktion:
t(aggregate(t(dat), list(a1), mean))