2013-12-03 2 views
1

Извините, люди, я не вижу лес для деревьев. Я много искал, но не смог найти решение. Я хочу, например, среднее значение для каждой единицы (возможно, rowMeans) подмножества переменных в матрице (или, возможно, фрейме данных) в R. Я хотел бы выбрать столбцы, используя вектор индексирования, как в tapply, который я назвал a1 в приведенном ниже примере.`apply`` rowMeans` через несколько наборов столбцов

> 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 

Решение в данном примере должно выглядеть так, но, конечно, я хотел бы сделать это в более всеобъемлющим образом. Я думал, что должен использовать функцию из семейства apply, но я не мог узнать, какой из них.

> cbind(rowMeans(dat[, a1 == 1]), rowMeans(dat[, a1 == 2])) 
     [,1] [,2] 
[1,] 2.000000 1.0 
[2,] 1.333333 1.5 
+0

Вы должны установить семя, чтобы сделать ваш пример воспроизводимым. – agstudy

ответ

1

Вы все еще можете использовать tapply здесь:

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

Если вы t ranspose ваши данные, вы можете использовать by:

t(do.call(rbind,by(t(dat),a1,colMeans))) 
      1 2 
V1 2.000000 1.0 
V2 1.333333 1.5 
1

Вы также можете использовать aggregate функцию:

t(aggregate(t(dat), list(a1), mean)) 
Смежные вопросы