强制R中的sample()对所有k个子阵列

时间:2018-01-14 18:32:48

标签: r sample

我的问题如下,我考虑了许多推导:

我有一个数组,比如尺寸为dims = c(10000,5,2) - 即10行,5列和2个子数组。

我希望能够使用sample()函数对EACH子阵列中给定比例(比如m)的行进行采样,并将它们移动到BETWEEN子阵列中。

因此,请说使用子阵列2的第10行交换第5行子阵列1(参见下面的示例)。

我问了一个类似的问题

Moving rows between subarrays

得到了一些很好的帮助。

该解决方案很有用,但仅限于行的随机采样(意味着不会对所有子阵列进行采样)。

, , 1

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    4    3    4    4    3    4    5    2    4     4
 [2,]    1    4    3    5    4    5    4    5    2     4
 [3,]    1    5    2    1    1    2    1    4    5     1
 [4,]    3    1    1    3    5    4    2    4    4     4
 [5,]    3    2    5    1    2    2    5    5    4     3    <-- e.g., switch this row
 [6,]    4    5    5    2    3    4    1    3    5     5
 [7,]    5    5    5    5    1    4    3    1    2     5
 [8,]    3    4    3    1    3    3    4    3    2     3
 [9,]    1    1    3    2    4    4    1    4    2     3
[10,]    1    4    4    2    4    2    4    2    2     1

, , 2

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    5    5    1    1    5    2    1    4    3     1
 [2,]    4    3    2    4    3    5    5    5    4     3
 [3,]    2    4    1    1    4    2    2    2    3     4
 [4,]    5    1    4    5    4    4    3    4    4     5
 [5,]    1    5    5    4    3    3    5    2    2     2
 [6,]    2    2    2    2    5    5    3    4    3     5
 [7,]    5    2    1    1    2    5    3    4    4     2
 [8,]    3    4    3    3    1    3    3    2    3     5
 [9,]    2    1    4    4    3    2    4    5    5     2
[10,]    5    3    4    5    4    3    5    1    2     3    <-- with this row

在上面的例子中,m = 0.10,即每个子阵列中10%的行(1行)被采样然后交换。

有关如何强制sample()在所有子阵列中采样的任何想法?理想情况下,每个子数组中的行数将非常大(10000或更多)。

虽然我只包含了2个子数组,其中一个或多个随机行在子数组2中用随机行交换(由m表示),我需要一个可以推广到k个子数组的例程。因此,如果k = 3,则在所有子阵列中进行采样,并且随机行与相邻子阵列交换。

因此,子阵列1中的一个或多个随机行具有相同的移动到子阵列2或子阵列3的可能性(只要它们总是在子阵列之间移动,它们与哪个子阵列行没有关系。然后,子阵列2或3中相应的一行或多行将转到子阵列1。

行数必须保持不变。例如,子阵列1中不能有11行,而子阵列2中只有9行 - 它必须是10和10。

我不知道任何可以执行此操作的软件包。这里的目标是模拟动物的运动。

非常感谢任何想法。

1 个答案:

答案 0 :(得分:0)

这是冗长的,可以清理,但应该让你到那里。

set.seed(4)
x <- array(sample(1:10, 200, replace = T), dim = c(10, 10, 2))
nrows_x <- dim(x)[1]

proportion <- 0.10
idx <- sample(1:nrows_x, nrows_x * proportion)

rows_dim_1 <- x[idx, , 1]
rows_dim_2 <- x[idx, , 2]

x[idx, , 1] <- rows_dim_2
x[idx, , 2] <- rows_dim_1