按ID分组随机抽样单条数据:含事件与无事件ID的样本提取需求
R按ID分组随机抽样(区分含事件/无事件ID)
原始数据
data <- data.frame( id = c(1,1,1,1,2,2,2,3,3,3,4,4,4), yearmonthweek = c(2012052,2012053,2012061,2012062,2013031,2013052,2013053,2012052,2012053,2012054,2012071,2012073,2012074), event = c(0,1,1,0,0,1,0,0,0,0,0,0,0), a = c(11,12,13,10,11,12,15,14,13,15,19,10,20) )
需求说明
需要对上述数据执行以下清洗规则:
- 区分两类ID:含事件ID(至少有1行
event=1的ID,如示例中的1、2)和无事件ID(所有行event=0的ID,如示例中的3、4) - 对每个含事件ID随机抽取1行,每个无事件ID也随机抽取1行,最终结果行数等于唯一ID的数量(示例中为4行)
解决方案
方法1:使用dplyr包(推荐,语法直观)
# 首次使用先安装包 # install.packages("dplyr") library(dplyr) cleaned_data <- data %>% group_by(id) %>% sample_n(size = 1) %>% # 每组随机抽取1行,自动适配两类ID ungroup() # 查看结果 print(cleaned_data)
方法2:基础R实现(无需额外包)
# 按ID分组抽样 cleaned_data <- do.call(rbind, by(data, data$id, function(x) x[sample(nrow(x), 1), ])) # 重置行名,让结果更整洁 rownames(cleaned_data) <- NULL # 查看结果 print(cleaned_data)
预期结果示例(随机抽样,结果不固定)
data.frame( id = c(1,2,3,4), yearmonthweek = c(2012053,2013052,2012052,2012073), event = c(1,1,0,0), a = c(12,12,14,10) )
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

