我希望能够在每个数组级别填充具有不同值的数组。
考虑数组
x <- array(dim = c(2, 5, 2)) # 2 levels, 5 columns, 2 rows
x
, , 1
[,1] [,2] [,3] [,4] [,5]
[1,] NA NA NA NA NA
[2,] NA NA NA NA NA
, , 2
[,1] [,2] [,3] [,4] [,5]
[1,] NA NA NA NA NA
[2,] NA NA NA NA NA
我现在生成随机值来填充数组的级别
y <- replicate(2, sample(1:10, 5, replace = FALSE))
y
[,1] [,2]
[1,] 6 5
[2,] 8 6
[3,] 9 3
[4,] 3 7
[5,] 2 9
用y的第一列(即值6,8,9,3,2)随机填充第一级x(x [,, 1])的最佳方法是什么,同样第二列第二列y(即5,6,3,7,9)的x(x [,2])水平?
也就是说,最终结果可能是
, , 1
[,1] [,2] [,3] [,4] [,5]
[1,] 6 8 3 3 2
[2,] 9 6 3 2 8
, , 2
[,1] [,2] [,3] [,4] [,5]
[1,] 6 6 9 3 5
[2,] 7 5 7 9 3
如果每个级别由相同的值组成(例如,两个级别具有随机值6,8,9,3,2),这将是一项简单的任务,但为此目的,阵列的每个级别都需要包含不同的值子集。
任何简单的解决方案?我意识到'abind'R包可以在这里工作,但我认为有一个更简单的方法。
答案 0 :(得分:1)
你好像掌握了所有的东西。你只需要把它们放在一起。确定数组的第三维的大小,构造它以便您可以填充而不是增长,将用于填充数组的值集合在一起,然后填充它。
set.seed(123)
d3 <- 2
x <- array(dim = c(2, 5, d3))
y <- replicate(d3, sample(1:10, 5, replace = FALSE))
for (i in seq_len(d3)) x[,,i] <- sample(y[,i], 10, replace = TRUE)
x
# , , 1
#
# [,1] [,2] [,3] [,4] [,5]
# [1,] 6 7 3 8 8
# [2,] 4 4 6 3 6
#
# , , 2
#
# [,1] [,2] [,3] [,4] [,5]
# [1,] 3 4 4 8 5
# [2,] 4 3 4 8 1
y
# [,1] [,2]
# [1,] 3 1
# [2,] 8 5
# [3,] 4 8
# [4,] 7 4
# [5,] 6 3
答案 1 :(得分:0)
您只需将10x2 matrix
重铸为2x5x2 array
:
set.seed(2017);
y <- replicate(2, sample(1:10, 5), replace = F)
array(apply(y, 2, function(x) sample(x, 10, replace = TRUE)), dim = c(2, 5, 2))
#, , 1
#
# [,1] [,2] [,3] [,4] [,5]
#[1,] 3 10 4 5 9
#[2,] 10 4 5 3 9
#
#, , 2
#
# [,1] [,2] [,3] [,4] [,5]
#[1,] 10 2 1 10 8
#[2,] 1 10 2 1 1
#y;
# [,1] [,2]
#[1,] 10 8
#[2,] 5 1
#[3,] 4 4
#[4,] 3 10
#[5,] 9 2
说明:apply(y, 2, ...)
创建一个10x2 matrix
,其中第1列中的条目从y
的第1列中抽样,第2列中的条目从{{1}的第2列中抽样}。然后,我们只需将y
10x2
重新转换为维度matrix
array
。