我正在尝试找到一种有效的方法来填充3D阵列。特别是,我想用前几列的值填充数组的列。
这是一个可复制的示例。
set.seed(1234)
no_ind <- 10
time_period <- 8
## Define the 3D array
col_array <- c(paste("day_", seq(0, 7, 1), sep=""))
test <- array(0, dim=c(time_period, length(col_array), no_ind), dimnames=list(NULL, col_array, as.character(seq(1, no_ind, 1))))
print(test)
## Initialize the array
test[1,c("day_0"),] <- round(runif(no_ind, 0, 100))
print(test)
## Fill the array
for(time in 1:(time_period - 1)){
for(ind in 1:no_ind){
## print(time)
## print(ind)
test[time + 1,c("day_0"),ind] <- round(runif(1, 0, 100))
test[time + 1,c("day_1"),ind] <- test[time,c("day_0"),ind]
test[time + 1,c("day_2"),ind] <- test[time,c("day_1"),ind]
test[time + 1,c("day_3"),ind] <- test[time,c("day_2"),ind]
test[time + 1,c("day_4"),ind] <- test[time,c("day_3"),ind]
test[time + 1,c("day_5"),ind] <- test[time,c("day_4"),ind]
test[time + 1,c("day_6"),ind] <- test[time,c("day_5"),ind]
test[time + 1,c("day_7"),ind] <- test[time,c("day_6"),ind]
}
}
print(test)
实际上,我的3D数组包含366行,8列和第3维的10000个观测值。我该如何自动化?
答案 0 :(得分:1)
您可以使用sapply
的隐式(默认情况下)simplify = TRUE
参数,并使用replicate
一步生成3D阵列
dims <- c(8, 8, 10) # The dimensions of your array
set.seed(2017)
arr <- replicate(dims[3], {
rand <- round(runif(dims[1], 0, 100));
sapply(seq_along(1:dims[1]), function(i)
c(rep(0, i - 1), rand[1:(dims[1] - i + 1)])) })
sapply(...)
在默认情况下具有simplify = TRUE
,并根据您的规范返回一个数组,该数组的值在下部三角形部分。 replicate
然后将重复该过程10次。这也减少了runif
个调用的次数,因为我们绘制了10
次8
个随机数,而不是分别绘制10x8=80
个随机数。