С вашим кодом я бы сказал, что вы вычисляете по строкам совокупное среднее вашего alphas
.
С помощью строки в вашем цикле вы делите векторное деление, которое даетсредние кумулятивные суммы каждого столбца.
Посмотрите, что ncol(z)
дает
> ncol(z)
[1] 3
Так что в основном то, что вы делаете с z[i, ] / (1:ncol(z))
в вашем цикле, является делением каждой строкивектором или последовательностью, соответственно, с длиной номеров столбцов, то есть c(1, 2, 3)
или просто 1:3
.
Рассмотрим первую строку вашего alphas
и ваш z
.
set.seed(42) # for sake of reproducibility
alphas <- matrix(runif(900), ncol=3, byrow=TRUE)
z <- t(apply(alphas, 1, cumsum))
> alphas[1, ]
[1] 0.9148060 0.9370754 0.2861395
> z[1, ]
[1] 0.914806 1.851881 2.138021
> cbind(alphas[1, 1], mean(c(alphas[1, 1:2])), mean(c(alphas[1, 1:3])))
[,1] [,2] [,3]
[1,] 0.914806 0.9259407 0.7126737
Ядро вашего цикла дает
> z[1, ] / 1:ncol(z)
[1] 0.9148060 0.9259407 0.7126737
Таким образом, каждый элемент строки z[1, ]
будет разделен на соответствующий ему делитель вектора, что даст средние значения агрегированных ячеек вашего циклапросто делает это для всей матрицы z
.
Кстати - быстрее и удобнее в R мы делаем это векторизованным способом внутри функции.Поскольку вы понимаете apply()
, вы поймете sapply()
.Что мы будем использовать, сначала определив функцию.
FUN1 <- function(i){
z[i, ] / 1:ncol(z)
}
M <- t(sapply(1:nrow(z), FUN1))
> head(M, 3)
[,1] [,2] [,3]
[1,] 0.9148060 0.9259407 0.7126737
[2,] 0.8304476 0.7360966 0.6637630
[3,] 0.7365883 0.4356275 0.5094157
Это дает то же самое, что и ваш цикл, но R .
За один шаг мы можем сделатьэта поговорка
z <- t(sapply(seq_len(nrow(alphas)),
function(i) cumsum(alphas[i, ]) / seq_along(alphas[i, ])))
> head(z, 3)
[,1] [,2] [,3]
[1,] 0.9148060 0.9259407 0.7126737
[2,] 0.8304476 0.7360966 0.6637630
[3,] 0.7365883 0.4356275 0.5094157