【问题标题】:Repeatedly Complementary subsets重复互补子集
【发布时间】:2014-08-07 06:24:16
【问题描述】:

我想重复地将一个集合分成两个已知大小的互补子集,并将它们保留为两个矩阵的列。例如假设主集是 {1, 2, ..., 10},第一个样本的大小是 8,我想重复采样 3 次。我想要:

     [,1] [,2] [,3]
[1,]   10    9    1
[2,]    8    1   10
[3,]    3    7    5
[4,]    4    2    3
[5,]    1    8    8
[6,]    6    4    2
[7,]    9    5    7
[8,]    5   10    6

     [,1] [,2] [,3]
[1,]    2    3    4
[2,]    7    6    9

知道如何在 R 中实现它以避免for 循环吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    我会使用replicate + sample,像这样:

    set.seed(1)                             # Just so you can replicate my results
    A <- replicate(3, sample(10, 8, FALSE)) # Change 3 to the number of replications
    A
    #      [,1] [,2] [,3]
    # [1,]    3    7    8
    # [2,]    4    1    9
    # [3,]    5    2    4
    # [4,]    7    8    6
    # [5,]    2    5    7
    # [6,]    8   10    2
    # [7,]    9    4    3
    # [8,]    6    6    1
    

    对于另一组,我会使用apply + setdiff,像这样:

    B <- apply(A, 2, function(x) setdiff(1:10, x))
    B
    #      [,1] [,2] [,3]
    # [1,]    1    3    5
    # [2,]   10    9   10
    

    @thelatemail 建议的另一个选项(这会更有效)是创建使用 replicate 来创建原始矩阵,并使用基本子集来创建单独的矩阵。

    A <- replicate(3, sample(10))
    B <- A[-(seq_len(8)), ]
    A <- A[seq_len(8), ]
    

    【讨论】:

    • 非常感谢。我不知道如何实现应用
    • 主题的变体:A &lt;- replicate(3,sample(10));B &lt;- A[-(seq_len(8)),];A &lt;- A[seq_len(8),];
    • @thelatemail,这将比apply 更有效--我已将其编辑为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2019-03-25
    • 2019-03-29
    • 2015-02-23
    • 2016-07-13
    • 2015-03-23
    相关资源
    最近更新 更多