如何在R中按组基于抽样行号填充列(依据每组行数)
使用dplyr/tidyverse实现按组随机标记行
当然可以用tidyverse工具链实现这个需求,核心思路是按组生成行号,随机抽取指定数量的行号后标记对应行,以下是具体实现代码:
library(tidyverse) # 生成示例数据(设置随机种子保证结果可复现) set.seed(123) dat <- data.frame(Group1 = sample(letters[1:3], 15, replace = TRUE)) # 核心处理逻辑 dat_with_sampled <- dat %>% group_by(Group1) %>% mutate( # 标记组内的行号,判断当前行是否在随机抽取的3个行号中 sampled = case_when( row_number() %in% sample(row_number(), size = min(n(), 3), replace = FALSE) ~ 999, TRUE ~ NA_real_ ) ) %>% ungroup() # 可选:取消分组,根据后续需求决定 # 查看结果 print(dat_with_sampled)
代码说明:
group_by(Group1):按Group1列分组,确保后续操作在每组内独立执行row_number():生成每组内的行号,用来定位组内的具体行sample(row_number(), size = min(n(), 3), replace = FALSE):- 从组内行号中随机抽样,
size = min(n(), 3)保证当组内行数不足3时,抽取所有行(避免抽样数量大于组内行数导致报错) replace = FALSE确保不会重复抽取同一行
- 从组内行号中随机抽样,
case_when():判断当前行是否在抽样行号中,符合条件则填充999,否则填充NAungroup():可选操作,若后续不需要分组状态,可取消分组
如果确定每组的行数都≥3,可直接将size = min(n(), 3)替换为size = 3,简化代码。
内容的提问来源于stack exchange,提问作者user007
相关产品推荐
相关产品推荐

