R 在保持原始数据分布比例的同时选择随机行?
假设我有以下数据R 在保持原始数据分布比例的同时选择随机行?,r,data.table,R,Data.table,假设我有以下数据 d <- data.table(group=rep(letters[1:5],c(30,20,20,20,10)), x=1:100, y=101:201) 现在,我如何选择一个小样本,比如说10行(或10%的数据),它基于一个或多个列具有大致相似的组分布。因此,对于上表,我可以得到的假设子集如下: group x y a 8 108 b 32 132 e 93 193 b 46 146
d <- data.table(group=rep(letters[1:5],c(30,20,20,20,10)), x=1:100, y=101:201)
现在,我如何选择一个小样本,比如说10行(或10%的数据),它基于一个或多个列具有大致相似的组分布。因此,对于上表,我可以得到的假设子集如下:
group x y
a 8 108
b 32 132
e 93 193
b 46 146
d 88 188
c 53 153
c 68 168
a 19 119
d 74 174
a 24 124
我最好在data.table中如何实现这一点?有一个关于的问题讨论了这一点,但我不想手动计算分布百分比。您可以按组对索引/行数进行采样。I
然后使用它对原始数据表进行子集划分:
d[d[, sample(.I, .N * 0.1), group]$V1]
# group x y
# 1: a 10 110
# 2: a 2 102
# 3: a 14 114
# 4: b 45 145
# 5: b 49 149
# 6: c 62 162
# 7: c 51 151
# 8: d 84 184
# 9: d 76 176
#10: e 100 200
这里,
.I
是一个整数向量,表示全局行号,即,seq_len(nrow(d))
,d[,sample(.I,.N*0.1),group]
,然后从每组中取一定比例的行号,用索引将原始数据.table子集(未命名列默认为V1
)提供您需要的。我认为您应该使用插入符号。createDataPartition()
函数用于子集数据集,而不会丢失目标变量的概率分布
library(caret)
my.ids <- createDataPartition(d$group, p = 0.1)
train <- d[as.numeric(my.ids[[1]]), ]
或
d[sample(.N),head(.SD,.N*.1),by=group]
(把所有行都混在一起,然后选择top)。@Frank Nice one。谢谢Psidom和Frank!感谢@Frank也修复了问题格式。非常感谢,非常好!感谢Damiano指出了caret::createDataPartition
,并给出了完整的答案。
library(caret)
my.ids <- createDataPartition(d$group, p = 0.1)
train <- d[as.numeric(my.ids[[1]]), ]
par(mfrow = c(1,2))
barplot(table(d$group), main = "full dataset")
barplot(table(train$group), main = "subset")