Puoi ancora usare tapply
qui:
do.call(rbind,
tapply(seq_len(ncol(dat)),a1,
function(i)rowMeans(dat[,i])))
Domanda
Scusa, gente, non riesco a vedere la foresta per gli alberi. Ho cercato molto ma non sono riuscito a trovare una soluzione. Voglio, ad esempio, la media per ogni unità (potenzialmente il rowMeans
) di un sottoinsieme di variabili in una matrice (o potenzialmente un frame di dati) in R
. Vorrei selezionare le colonne usando un vettore di indicizzazione come in tapply
, che ho chiamato a1
Nell'esempio seguente.
> 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
La soluzione in questo esempio dovrebbe apparire così, ma ovviamente mi piacerebbe farlo in modo più completo. Stavo pensando che avrei dovuto usare una funzione da apply
famiglia, ma non sono riuscito a scoprire quale.
> cbind(rowMeans(dat[, a1 == 1]), rowMeans(dat[, a1 == 2]))
[,1] [,2]
[1,] 2.000000 1.0
[2,] 1.333333 1.5
Soluzione
Puoi ancora usare tapply
qui:
do.call(rbind,
tapply(seq_len(ncol(dat)),a1,
function(i)rowMeans(dat[,i])))
Altri suggerimenti
Se tu t
Responi i tuoi dati, puoi usare by
:
t(do.call(rbind,by(t(dat),a1,colMeans)))
1 2
V1 2.000000 1.0
V2 1.333333 1.5
Potresti anche usare il aggregate
funzione:
t(aggregate(t(dat), list(a1), mean))