某些数据的大小小于2的数据列表中的sample_n(2,replace = F)问题

时间:2019-05-23 04:54:19

标签: r dplyr sampling

我需要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个obs,它起作用了。但不适用于某些组中的风险小于2磅的风险集。对于拥有少于2个obs的组,我想要它拥有的所有obs。对于拥有2个以上Obs的组,我想采样2个Obs而无需更换。如何使用R函数实现采样目标?预先感谢!

1 个答案:

答案 0 :(得分:0)

我们可以使用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)