随机填充R数组

时间:2018-06-18 23:37:26

标签: arrays r

我希望能够在每个数组级别填充具有不同值的数组。

考虑数组

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包可以在这里工作,但我认为有一个更简单的方法。

2 个答案:

答案 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