【发布时间】: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
【问题讨论】: