我需要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函数实现采样目标?预先感谢!
答案 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)