You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:45:30