Преобразование матрицы в частичное среднее - PullRequest
2 голосов
/ 06 мая 2011

У меня есть матрица 320 * 25, которую я хочу преобразовать в матрицу 64 * 25 таким образом: каждая строка новой матрицы должна иметь средние значения для каждых 5 строк старой (и тогда они будут нормализованыпо определенному вектору аналогичным образом).Ниже вы можете увидеть, как я пытался реализовать это:

for (x in c(1:64)){

      helping.matrix[x,] = colSums(original.matrix[((5*(x-1)+1):5*x),])/sum(vector[((5*(x-    1)+1):5*x)])

}

К сожалению, это не сработало, возвращая следующую ошибку:

Ошибка в наследовании (x,"data.frame"): нижний индекс вне границ

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Существует ряд проблем, связанных с тем, как вы пытались повлиять на это. Во-первых, это помогает сделать пример воспроизводимым:

original.matrix <- matrix(1:(320*25), nrow=320, ncol=25)

Во-вторых, если вы собираетесь использовать цикл for, вам нужно инициализировать объект для хранения результатов:

helping.matrix <- matrix(nrow=64, ncol=25)

Хорошо, теперь давайте посмотрим на ваш код.

for (x in c(1:64)){
helping.matrix[x,] = colSums(original.matrix[((5*(x-1)+1):5*x),])/

Индексное выражение здесь довольно дикое и не делает то, что вы хотите. Например, когда x = 2, (5*(x-1)+1):5*x = 12, 10. Это не соответствует вашей заявленной цели. при x = 9 выражение возвращает значения, превышающие количество строк в original.matrix, поэтому вы получаете ошибку «вне границ». Следующая проблема возникает, когда мы добираемся до

vector[((5*(x-1)+1):5*x)])

Здесь вы пытаетесь индексировать vector, как если бы это был объект данных. Но вектор - это не объект данных, это функция. Может быть, вы хотите c((5*(x-1)+1):5*x)? В любом случае, из вашего вопроса не совсем ясно, для чего предназначен этот раздел кода, поэтому я не могу предложить много предложений здесь.

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

groups <- rep(1:(320/5), each=5)

Затем используйте цикл или функцию apply-family для перебора групп. Подход для цикла выглядит примерно так:

helping.matrix <- matrix(nrow=64, ncol=25)
for(i in unique(groups)) {
helping.matrix[i,] <- colSums(original.matrix[groups == i,])
}

и подход, основанный на применении, будет выглядеть как

helping.matrix <- Reduce(rbind, by(original.matrix, groups, colSums))

Я упустил ту часть, которая должна "нормализоваться по определенному вектору", потому что мне не ясно, что на самом деле должно происходить там.

2 голосов
/ 06 мая 2011

Ну, это может сделать это - если у вас есть числовые значения без NA: s ...

m <- matrix(runif(320*25),320)
k <- 5
m2 <- rowsum(m, rep(seq(nrow(m)/k), each=k))/k
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...