首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择随机行,同时保持原始数据分布的比例?

选择随机行,同时保持原始数据分布的比例?
EN

Stack Overflow用户
提问于 2017-09-09 01:36:32
回答 2查看 667关注 0票数 0

假设我有以下data.table

代码语言:javascript
运行
复制
d <- data.table(group=rep(letters[1:5],c(30,20,20,20,10)), x=1:100, y=101:201)

,它表示5个组的数据,这些组分布为

代码语言:javascript
运行
复制
d[,.N,by=group]

现在,我如何选择一个小样本,比方说10行(或数据的10% ),它具有大致相同的基于一个或多个列的组分布。因此,对于上表,我可以收到的假设子集如下:

代码语言:javascript
运行
复制
  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?关于SO here有一个问题来讨论这个问题,但是我不想手动计算分布百分比。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-09 02:10:53

我认为你应该使用caretcreateDataPartition()函数的目的是在不丢失目标变量的概率分布的情况下对数据集进行子集。

代码语言:javascript
运行
复制
library(caret)
my.ids <- createDataPartition(d$group, p = 0.1)
train <- d[as.numeric(my.ids[[1]]), ]

您可以检查目标变量在总体和子集中的分布情况。

代码语言:javascript
运行
复制
par(mfrow = c(1,2))
barplot(table(d$group), main = "full dataset")
barplot(table(train$group), main = "subset")

票数 6
EN

Stack Overflow用户

发布于 2017-09-09 01:48:52

您可以按组对索引/row_number .I进行示例,然后使用它对原始数据表进行子集:

代码语言:javascript
运行
复制
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],然后从每个组中取一部分行号,用索引的原始data.table子集(未命名的列默认为V1)给出所需的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46126394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档