随机抽样保持每列至少一个级别

时间:2017-11-10 14:52:06

标签: r sampling

希望有人可以帮我解决这个问题:我试图弄清楚如何从data.frame中随机抽取一定百分比的行,这些行包含多个(因子)列,确保在结果data.frame中有至少一个级别每列存在。

这里有一些数据:

NoSchedule

随机抽样20%的原始数据。框架会产生这样的结果:

    vs am gear carb
 1:  0  1  4  4
 2:  0  1  4  4
 3:  1  1  4  1
 4:  1  0  3  1
 5:  0  0  3  2
 6:  1  0  3  1
 7:  0  0  3  4
 8:  1  0  4  2
 9:  1  0  4  2
10:  1  0  4  4
11:  1  0  4  4
12:  0  0  3  3
13:  0  0  3  3
14:  0  0  3  3
15:  0  0  3  4
16:  0  0  3  4
17:  0  0  3  4
18:  1  1  4  1
19:  1  1  4  2
20:  1  1  4  1
21:  1  0  3  1
22:  0  0  3  2
23:  0  0  3  2
24:  0  0  3  4
25:  0  0  3  2
26:  1  1  4  1
27:  0  1  5  2
28:  1  1  5  2
29:  0  1  5  4
30:  0  1  5  6
31:  0  1  5  8
32:  1  1  4  2

在每一栏中,每个级别的因子仍然存在。

我的第一次尝试

功能"分层"来自图书馆" splitstackshape" /" fifer" (看起来像是相同的功能)。也是评论中建议的解决方案

    vs am gear carb
 1:  0  1  4  4
 2:  1  1  2  1
 3:  0  0  3  2
 4:  0  0  4  3
 5:  0  1  5  6
 6:  0  1  5  8

仍然没有从因子碳水化合物中返回所有级别:

DT <- as.data.table(mtcars)
DT <- DT[, lapply(.SD, as.factor), .SDcols = c("vs", "am", "gear", "carb")]

SFDT <-
  stratified(
    DT,
    c("vs", "am", "gear", "carb"),
    select = list(
      vs = levels(test$vs),
      am = levels(test$am),
      gear = levels(test$gear),
      carb = levels(test$carb)
    ),
    size = .5
  )

1 个答案:

答案 0 :(得分:0)

有一个很好的可重复的例子,使用&#39; fifer :: stratified&#39; here