【问题标题】:Forcing sample() in R to sample a given fraction of rows over all of k subarrays强制 R 中的 sample() 对所有 k 个子数组的给定部分行进行采样
【发布时间】:2018-01-14 18:32:47
【问题描述】:

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

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

我希望能够使用 sample() 函数对每个子数组中给定比例(例如 m)的行进行采样,并将它们移动到子数组之间。

因此,假设将第 5 行子数组 1 与子数组 2 的第 10 行交换(参见下面的示例)。

我问了一个类似的问题

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。

我不知道有任何软件包可以做到这一点。这里的目标是模拟动物的运动。

非常感谢任何想法。

【问题讨论】:

    标签: r sample


    【解决方案1】:

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

    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
    

    【讨论】:

    • 谢谢!我会在我的数据上尝试一下,然后在这里发布结果。
    • 看起来可行,但我需要做更多的测试。
    • 嗯...代码是否确保每个子数组中至少有一行被交换到相邻数组?当我使用更高维度运行上述实现时,我似乎没有注意到所有子数组中的行都已移动。
    • 不,不会。我在最初的问题中并不清楚。您可以编辑问题并更具体吗?例如,三个子数组会发生什么? 1 与 2 交换,2 与 3 交换吗?还是 3 与 1 交换?同样,四个子数组呢?最后,你能提供一些领域上下文吗?感觉这类问题最好通过使用包来解决。
    • 我添加了更多细节。移动子数组的哪些行并不重要,重要的是行在子数组之间移动并且每个子数组中的行数保持固定。
    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多