r - 在数据表中选择一个均匀分布的样本
问题描述
假设我有一个如下所示的示例数据集:
df = data.table(id = 1:100,group=rep(c('a','b','c','d'),25))
我想从这组x非重叠样本中获取 80 个观察值。重要的特征是每个样本的分布在每个组之间必须是均匀的。
例如:
x=20 will give a first sample of
1 a
5 b
15 c
28 d
这是一个非常方便的例子,但它也必须适用于不太方便的情况(例如当 x=7 时)。
我的第一次尝试是使用split,如下所示:
df_split = split(df, as.numeric(as.factor(df$id)) %% 7)
这就是我想要的,除了它没有从每个组中统一挑选!
解决方案
如果我理解正确,因为您正在寻找 7 组 80 个样本,您可能希望将其作为循环运行:
dt <- data.table(id = 1:100,group=rep(c('a','b','c','d'),25))
newmat <- data.frame(Index = 1:80)
for(i in 1:7){
k <- NULL
for(j in unique(dt$group)){
dt.sub <- dt[group == j]
samps <- sample_n(dt.sub, 20, replace = F)
k <- c(k,samps$id)
}
newmat <- cbind(newmat, k)
}
colnames(newmat) <- c("Index", paste0("k",1:7))
推荐阅读
- vim - 我们能否在评论部分转义类型、代码等,以便拼写检查不会将它们视为拼写错误
- java - 配置 Swagger-ui 路径
- python - 不可能做到“从硒导入网络驱动程序”
- angular - 加载资源失败:服务器响应状态为 404 (Not Found)-lab-logo.png
- linux - 如何在 linux 中使用 BIND 命令?
- c# - 执行数据更改操作的宁静方式
- java - Hibernate 和 JPA 项目:无效的列名错误
- c# - 有没有办法在 c# 桌面应用程序中使用 oauth2 登录 Xero api?
- r - 为什么我会从以下 for 循环中获得 NA?
- html - 为什么类容器在我的代码中不起作用?