2013-02-20 4 views
3

У меня есть следующая матрица данных глубины и температуры (855 строк, 2 столбца) и хотелось бы взять среднее из каждых 3 строк в каждом столбце. Например:взять среднее из строк в матрице r

[1,] -6.7 18.91 
[2,] -5.4 18.91 
[3,] -4.0 18.59 
[4,] -6.7 20.37 
[5,] -6.7 20.05 
[6,] -2.7 20.21 
[7,] -4.0 21.03 
[8,] -5.4 20.70 
[9,] -4.0 20.87 
[10,] -2.7 21.37 
[11,] -2.7 21.37 
[12,] -2.7 21.37 

mean(data[1:3,1]) 
mean(data[4:6,1]) 

для всей матрицы. Как я могу выполнить это без ручной записи кода для среднего из каждых трех строк? Любые идеи или предложения приветствуются.

+0

Что относительно MatLab? – fneron

ответ

6

Использование rollapply функция из зоопарка пакет. См. ?rollapply для более подробной информации.

library(zoo) 
rollapply(matrix[,1], width=3, mean, by=3) 

Пример:

> set.seed(1) 
> Data <- matrix(rnorm(30, 100, 50), ncol=2) # some random data 
> rollapply(Data[,1], width=3, mean, by=3) 
[1] 78.69268 118.40534 130.02559 126.60393 71.48317 
> # you could check this out by doing some verification as in: 
> mean(Data[1:3, 1]) 
[1] 78.69268 
> mean(Data[4:6, 1]) 
[1] 118.4053 
> mean(Data[7:9, 1]) # and so on ... 
[1] 130.0256 

Если вы хотите, среднее значение для всех столбцов в матрице, то просто добавьте by.column=TRUE в rollapply вызова:

> rollapply(Data, width=3, mean, by=3, by.colum=TRUE) 
      [,1]  [,2] 
[1,] 78.69268 114.71187 
[2,] 118.40534 138.90166 
[3,] 130.02559 81.12249 
[4,] 126.60393 106.79836 
[5,] 71.48317 74.48399 
+0

Вы правы. Виноват. Я удалю свой предыдущий комментарий, чтобы избежать путаницы. – GSee

+1

Спасибо, что отлично работал. – user1997414

4

Попробуйте использовать tapply и apply :

R > f <- rep(c(1:3), each = 3) 
R > f 
[1] 1 1 1 2 2 2 3 3 3 
R > x <- matrix(1:27, 9, 3) 
R > x 
     [,1] [,2] [,3] 
[1,] 1 10 19 
[2,] 2 11 20 
[3,] 3 12 21 
[4,] 4 13 22 
[5,] 5 14 23 
[6,] 6 15 24 
[7,] 7 16 25 
[8,] 8 17 26 
[9,] 9 18 27 
R > apply(x, 2, function(t) tapply(t, f, mean)) 
    [,1] [,2] [,3] 
1 2 11 20 
2 5 14 23 
3 8 17 26 
1

Мне очень нравится функция rollapply для этого, потому что его синтаксис близко соответствует тому, что вы пытаетесь сделать. Тем не менее, я думал, что буду способствовать потомству, как вы подходите к этой проблеме с пакетом «plyr».

Примечание: вы можете сделать все это в одном заявлении, но я сломал его, чтобы было легче понять.

Шаг 1: Настройте данные для сортировки.

data.plyr <- data.frame(test, group=floor((1:nrow(test)-1)/3)+1) 

Я только что добавил группу столбцов, которая присваивает номер группы каждые три столбца. По умолчанию оба столбца матрицы теперь «X1» и «X2».

Шаг 2: Запустите функцию colMeans для каждой группы.

library(plyr) 
ddply(data.plyr, .(group), colMeans) 

Для этого конкретного вопроса, я думаю, что пакет «plyr» является неоптимальным, но стоит отметить метод для дальнейшего использования. Функции «apply» и «rollapply» лучше всего работают с непрерывностью и согласованностью данных. В приложениях, где вам требуется больше гибкости, функции семейства «plyr» полезны для вашего инструментария.

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

  • Нет связанных вопросов^_^