使用分层采样从一个数据集创建n个数据集而不重复

时间:2016-02-04 10:34:45

标签: r random-sample

我有一个数据集train,其中有500行,我希望得到一个数据框,其中n列包含500/n个值(行数在其他列中没有重复),基于分层在列车中对一列进行抽样,比如train$y

我尝试了以下操作,但它返回重复值

library(caret)
n <- 10 # I want to divide my data set in to 10 parts
data_partition <- createDataPartition(y = train$y, times = 10, 
                                 p = 1/n, list = F)

总结一个例子, 如果我有一个数据集train,其中包含100行,其中一列是train$y(值= 0或1)。我希望从列车中获得10个数据集,每行10行,它们应该stratified基于train$y,并且不应该在其他9个数据集上看到它们。

示例输入:

ID  x   y
1   1   0
2   2   0
3   3   1
4   1   1
5   2   1
6   4   1
7   4   0
8   4   1
9   3   1
10  1   1
11  2   1
12  3   0
13  4   1
14  5   1
15  6   1
16  10  1
17  9   1
18  3   0
19  7   0
20  8   1

预期输出(第4列,每个预留的详细信息)

ID  x   y   sample      set 1           set 2           set 3   
1   1   0   set 2       ID  x   y       ID  x   y       ID  x   y
2   2   0   set 3       8   4   1       11  2   1       17  9   1
3   3   1   set 3       9   3   1       12  3   0       5   2   1
4   1   1   set 3       10  1   1       13  4   1       6   4   1
5   2   1   set 3       18  3   0       1   1   0       7   4   0
6   4   1   set 3       19  7   0       14  5   1       2   2   0
7   4   0   set 3       20  8   1       15  6   1       3   3   1
8   4   1   set 1                       16  10  1       4   1   1
9   3   1   set 1                                               
10  1   1   set 1                                               
11  2   1   set 2                                               
12  3   0   set 2                                               
13  4   1   set 2                                               
14  5   1   set 2                                               
15  6   1   set 2                                               
16  10  1   set 2                                               
17  9   1   set 3                                               
18  3   0   set 1                                               
19  7   0   set 1                                               
20  8   1   set 1   

在上面的示例中,输入为ID,xy我希望获得列sample ,我可以随时将其分隔到这3个表(右侧)。

请注意,数据中的y14- 1s6- 0s,其比率为70:30,输出集几乎具有相似的比例

采用复制/运行友好格式的样本数据集:

data <- structure(list(ID = 1:20, x = c(1L, 2L, 3L, 1L, 2L, 4L, 4L, 4L, 
3L, 1L, 2L, 3L, 4L, 5L, 6L, 10L, 9L, 3L, 7L, 8L), y = c(0L, 0L, 
1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 
0L, 1L)), .Names = c("ID", "x", "y"), class = "data.frame", row.names = c(NA, 
-20L))

1 个答案:

答案 0 :(得分:1)

可以使用caret包来完成。请尝试以下代码

# Createing dataset
data <- structure(list(ID = 1:20, x = c(1L, 2L, 3L, 1L, 2L, 4L, 4L, 4L, 
3L, 1L, 2L, 3L, 4L, 5L, 6L, 10L, 9L, 3L, 7L, 8L), y = c(0L, 0L, 
1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 
0L, 1L)), .Names = c("ID", "x", "y"), class = "data.frame", row.names = c(NA, -20L))
# Solution
library(caret)
k <- createFolds(data$y,k = 3,list = F)
addmargins(table(k,data$y))