Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无任何重叠的随机重新抽样_Python_R_Awk_Sed - Fatal编程技术网

Python 无任何重叠的随机重新抽样

Python 无任何重叠的随机重新抽样,python,r,awk,sed,Python,R,Awk,Sed,我有一个3000行50000列的表格。根据这些数据,我想制作5个数据集,其中包含原始数据的10%,没有任何重叠,在这种情况下,3000=300的10%。此外,我想有一个删除重新采样的数据集从原来的一个。范例 1.Original data (O) a. Randomly resampled dataset1 (RD1) b. Randomly resampled dataset2 (RD2) c. Randomly resampled dataset3 (RD3) d. Randomly res

我有一个3000行50000列的表格。根据这些数据,我想制作5个数据集,其中包含原始数据的10%,没有任何重叠,在这种情况下,3000=300的10%。此外,我想有一个删除重新采样的数据集从原来的一个。范例

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)), ]

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

如果不想更改原始数据,您可以将行洗牌,或者将索引数组洗牌到包含行的数组中,然后对前5组300行执行您想执行的操作,并从剩下的行中删除它们

# 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)
例如,使用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 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

也许你应该试试这个RD1=original[sample1:nroworiginal,replace=F,size=0.1*nroworiginal],让这变得非常简单。或者用splitsample20、seq20/5和lapply的子集做一个索引列表,并用负索引来获得集合的其余部分。
$ 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