【问题标题】:Random re-sampling without any overlaps没有任何重叠的随机重采样
【发布时间】:2018-02-01 19:42:22
【问题描述】:

我有一个包含 3000 行和 50,000 列的表。从这些数据中,我想制作 5 个数据集,其中包含 10% 的原始数据而没有任何重叠(在这种情况下,3000 的 10%=300)。我也想从原始数据集中删除重新采样的数据集。示例

1.Original data (O)
a. Randomly resampled dataset1 (RD1)
b. Randomly resampled dataset2 (RD2)
c. Randomly resampled dataset3 (RD3)
d. Randomly resampled dataset4 (RD4)
e. Randomly resampled dataset5 (RD5)
2. remove RD from O 
a. O - RD1 = New dataset1
b. O - RD2 = New dataset2
c. O - RD3 = New dataset3
d. O - RD4 = New dataset4
e. O - RD5 = New dataset5

我在 R 中尝试了如下所示的随机重采样

original=read.table("table1.txt", header=F)
RD1=original[sample(nrow(original), replace=F, size=0.1*nrow(original)), ]

但它有重叠。如何制作非重叠集?以及如何从原始数据集中删除 RD 以制作新数据集?任何 awk、sed、python 或 R 解决方案?

【问题讨论】:

  • 也许你应该试试这个RD1=original[sample(1:nrow(original), replace=F, size=0.1*nrow(original)), ]
  • modelr 让这变得非常简单。
  • 或者使用split(sample(20), seq(20/5)) 之类的索引列表和lapply 的子集(使用负索引来获取其余部分)。

标签: python r awk sed


【解决方案1】:
# Reproducible data    
data <- mtcars
n <- nrow(data)
K <- 5
# Get indices for splitting
ind <- integer(n)
new <- rep(1:K, each = 0.1 * n)
ind[sample(n, size = length(new))] <- new
# Split data
split(data, ind)

【讨论】:

    【解决方案2】:

    如果您不想更改原始数据,您可以只打乱行,或者打乱包含行的数组的索引数组,然后对前 5 组数据做任何您想做的事情300 行,然后从剩下的内容中删除它们。

    例如使用 30 行的输入(数字 1->30)而不是 3000:

    $ cat tst.awk
    function shuf(array,    i, j, t) {
        # Shuffles an array indexed by numbers from 1 to its length
        # Copied from https://www.rosettacode.org/wiki/Knuth_shuffle#AWK
        for (i=length(array); i > 1; i--) {
            # j = random integer from 1 to i
            j = int(i * rand()) + 1
    
            # swap array[i], array[j]
            t = array[i]
            array[i] = array[j]
            array[j] = t
        }
    }
    
    { arr[NR] = $0 }
    
    END {
        srand()
        shuf(arr)
        numBlocks = 5
        pct10 = length(arr) * 0.1
        for (i=1; i<=numBlocks; i++) {
            print "------- Block", i
            for (j=1; j<=pct10; j++) {
                print ++c, arr[c]
                delete arr[c]
            }
        }
        print "\n------- Remaining"
        for (i in arr) {
            print i, arr[i]
        }
    }
    

    .

    $ seq 30 | awk -f tst.awk
    ------- Block 1
    1 24
    2 27
    3 28
    ------- Block 2
    4 11
    5 16
    6 19
    ------- Block 3
    7 2
    8 5
    9 25
    ------- Block 4
    10 18
    11 22
    12 15
    ------- Block 5
    13 20
    14 10
    15 14
    
    ------- Remaining
    16 12
    17 17
    18 1
    19 8
    20 23
    21 21
    22 9
    23 30
    24 7
    25 29
    26 6
    27 26
    28 13
    29 3
    30 4
    

    再次表明输出是随机的:

    $ seq 30 | awk -f tst.awk
    ------- Block 1
    1 17
    2 15
    3 22
    ------- Block 2
    4 19
    5 1
    6 13
    ------- Block 3
    7 7
    8 10
    9 28
    ------- Block 4
    10 5
    11 2
    12 8
    ------- Block 5
    13 16
    14 11
    15 30
    
    ------- Remaining
    16 14
    17 18
    18 26
    19 4
    20 29
    21 12
    22 21
    23 27
    24 3
    25 24
    26 6
    27 9
    28 23
    29 20
    30 25
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 2015-12-12
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      相关资源
      最近更新 更多