我需要在r:'dplyr'中的sample_n((帮助:我有一个数据 riskset[[1]], riskset[[2]],..., riskset[[1000]])
的列表,列表的每个元素riskset[[i]]
都是观测值的数据框架,并且根据变量的分布,我将每个riskset
中的观测值分为组1:4。因此riskset[[i]]
中的数据看起来像这样:
id sex grp ...
1 F 1 ...
2 M 3 ...
3 F 1 ...
4 M 4 ...
5 F 2 ...
6 F 3 ...
......................
我想从每个风险集中的每个GRP中进行2个观测值,并将其保存为样本列表。我用了 sample<- list()
for(i in 1:1000){
sample[[i]] <- riskset[[i]] %>% group_by(grp) %>% sample_n(2,replace=F)
}
它给了我错误:
size must be less or equal than 1 (size of data), set ‘replace = TRUE’ to use sampling with replacement.
我尝试了风险集中的代码,该代码在每个GRP中都有2个以上的观察,它起作用。但这在某些组中少于2个OBS的风险集上不起作用。对于少于2个OBS的小组,我想要所有的观察。对于具有超过2个OBS的组,我想在不替换的情况下对2个观察进行采样。如何使用R功能实现我的采样目标?预先感谢!
我们可以使用 map
在 list
('风险集'(上循环,然后由'grp'分组,应用 sample_n
library(tidyerse)
out <- map(riskset, ~ .x %>%
group_by(grp) %>%
sample_n(pmin(n(), 2), replace = TRUE))
或其他选项是slice
map(riskset, ~ .x %>%
group_by(grp) %>%
slice(if(n() < 2) 1 else sample(row_number(), 2))
或不使用if/else
map(riskset, ~ .x %>%
group_by(grp) %>%
slice(sample(seq_len(pmin(n(), 2)))))
数据
iris1 <- iris %>%
select(grp = Species, everything()) %>%
slice(c(1:5, 51))
riskset <- list(iris1, iris1)