Существует ряд проблем, связанных с тем, как вы пытались повлиять на это. Во-первых, это помогает сделать пример воспроизводимым:
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))
Я упустил ту часть, которая должна "нормализоваться по определенному вектору", потому что мне не ясно, что на самом деле должно происходить там.