随机重新采样,没有任何重叠

时间:2017-08-24 04:19:09

标签: python r awk sed

我有一个包含3000行和50,000列的表。根据这些数据,我想制作5个数据集,其中包含10%的原始数据而没有任何重叠(在这种情况下,10%的3000 = 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解决方案?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

如果你不想改变原始数据,你可以随意洗牌,或者将一系列索引洗牌到包含这些行的数组,然后做你想做的任何事情。设置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