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
È stato utile?

Soluzione

Puoi ancora usare tapply qui:

do.call(rbind,
          tapply(seq_len(ncol(dat)),a1,
           function(i)rowMeans(dat[,i])))

Altri suggerimenti

Se tu tResponi 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))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top