`anwenden Sie die" Rowmeans "über mehrere Sätze von Spalten über Säulen hinweg

StackOverflow https://stackoverflow.com/questions/20353209

  •  25-08-2022
  •  | 
  •  

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
War es hilfreich?

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 tRansponieren 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))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top