【问题标题】:r random sampling keeping at least one level per columnr 随机抽样,每列至少保持一个级别
【发布时间】:2017-11-10 14:52:06
【问题描述】:

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

这是一些数据:

    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

随机抽样 20% 的原始 data.frame 得到这样的结果就可以了:

    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

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

我的第一次尝试

库“splitstackshape”/“fifer”中的“分层”函数(似乎是同一个函数)。也是来自 cmets 的建议解决方案

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
  )

仍然没有返回因子 carb 的所有水平:

    vs am gear carb
 1:  1  0    3    1
 2:  1  0    3    1
 3:  1  1    4    1
 4:  1  1    4    1
 5:  0  0    3    2
 6:  0  0    3    2
 7:  1  0    4    2
 8:  1  1    4    2
 9:  0  0    3    3
10:  0  0    3    3
11:  0  0    3    4
12:  0  0    3    4
13:  1  0    4    4
14:  0  1    4    4

【问题讨论】:

    标签: r sampling


    【解决方案1】:

    有一个使用 'fifer::stratified' here 的很好的可重现示例。

    【讨论】:

    • 感谢您的反馈!我编辑了我的问题,因为您的回答并没有直接帮助我解决我的问题
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多