填充3D阵列的有效方法

时间:2018-07-12 03:52:24

标签: r multidimensional-array

我正在尝试找到一种有效的方法来填充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个观测值。我该如何自动化?

1 个答案:

答案 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个调用的次数,因为我们绘制了108个随机数,而不是分别绘制10x8=80个随机数。