2013-07-04 5 views
2

У меня есть длинная матрица, из которой мне нужно вычислить среднее значение для определенного интервала строк. На данный момент я делаю это вручную следующим образом:Вычислить среднее между интервалами строк

values <- cbind(1:50,1) 

meanqual10 <- mean(values[1:10,1]) 
meanqual10 
[1] 5.5 
meanqual15 <- mean(values[11:20,1]) 
meanqual15 
[1] 15.5 
meanqual20 <- mean(values[21:30,1]) 
meanqual20 
[1] 25.5 
meanqual25 <- mean(values[31:40,1]) 
meanqual25 
[1] 35.5 
meanqual30 <- mean(values[41:50,1]) 
meanqual30 
[1] 45.5 

Должен быть более приятный способ сделать это. Может ли кто-нибудь помочь, пожалуйста?

ответ

3
by(values[,1], ceiling(1:50/10), mean) 

ceiling(1:50/10) создает вектор длины 50 с новым целым числом каждые 10 чисел.

by затем возьмет mean для каждой группы того же целого числа.

Результат: ответ

ceiling(1:50/10): 1 
[1] 5.5 
------------------------------------------------------------------------------------------------------ 
ceiling(1:50/10): 2 
[1] 15.5 
------------------------------------------------------------------------------------------------------ 
ceiling(1:50/10): 3 
[1] 25.5 
------------------------------------------------------------------------------------------------------ 
ceiling(1:50/10): 4 
[1] 35.5 
------------------------------------------------------------------------------------------------------ 
ceiling(1:50/10): 5 
[1] 45.5 
+0

очень красивый, я еще не знал о потолке. Я до сих пор новичок в R – jaspb

4

сеньора O является хорошо, если у вас есть регулярные интервалы. Другой подход, если вы хотите, чтобы выбрать произвольные строки может быть что-то вроде:

l <- list(1:10,11:20,21:30,31:40,41:50) # vectors of any length or ordering 
sapply(l, function(x) mean(values[x,1])) 

Что дает:

[1] 5.5 15.5 25.5 35.5 45.5 

И конечно by может сделать это для произвольных строк, тоже. Это немного другой подход.

+0

. Спасибо за другое понимание того, как использовать sapply. – jaspb

Смежные вопросы