【发布时间】:2021-09-27 05:47:38
【问题描述】:
我有一个数据集,其中每个id 有多个样本,可以分层为group 变量。我想做随机抽样,按group 分层,但不重复id(即每个id 在输出中只出现一次)。
我尝试修改一些现有的解决方案,但是,所有解决方案似乎都对数据进行了采样,并在各个组中包含来自单个 id 的多个样本:
- random sampling - matrix
- Stratified random sampling from data frame
- Stratified random sampling in R
- Stratified random sampling from data frame
我尝试了以下方法,认为 replace = FALSE 可能有助于确保每个 id 中只使用 1 个样本,但这仍然不能满足我的要求。
set.seed(1)
# Data
data <- data.frame(
id = c("A", "C", "B", "D", "E", "F", "A", "A", "B", "B", "B", "D", "D", "E", "E", "F"),
group = c("1", "1", "2", "2", "3", "3", "2", "1", "1", "2", "3", "2", "3", "2", "1", "3"),
length = c("54", "52", "43", "42", "60", "46", "59", "60", "51", "45", "47", "58", "48", "46", "56", "57"))
# Stratified random sampling by group
sample <- data %>%
distinct %>%
group_by(group) %>%
sample_n(2, replace = FALSE) %>%
left_join(data)
sample 输出:
id group length
A 1 60
C 1 52
D 2 42
A 2 59
B 3 47
E 3 60
但是,如上所示,id= A 在 group 1 和 2 中重复出现。我想要的理想输出应该是这样的,其中每个id 只出现一次,并且样本按group 分层:
id group length
A 1 54
C 1 52
B 2 43
D 2 42
E 3 60
F 3 46
有没有办法自定义现有的解决方案,以便在对每个group 进行采样时,如果一个id 已经用于另一个group,它将被排除在外,而不是为另一个group 采样?我知道我可以将%>% distinct(id) 添加到我的代码中,但我相信这将不再是随机的,因为distinct() 只是为id 选择了第一行。感谢您的帮助!
【问题讨论】:
-
如果组的数量很小且已知数量,您是否能够在跟踪被采样的 id 的同时迭代组,以便在进入下一个组时,在采样之前执行 setdiff()?