r语言 - 某些数据大小小于 2 的数据列表中的 sample_n(2, replace=F) 出现问题



我需要在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功能实现我的采样目标?预先感谢!

我们可以使用 maplist('风险集'(上循环,然后由'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)

相关内容

  • 没有找到相关文章