如何在R中按ID抽取数据框样本:保留选中ID的所有行
按个体抽取完整样本的R实现
你需要的是抽取整个个体的所有观测行,而非随机抽取独立行。核心思路是先随机选中若干个id,再筛选出这些id对应的所有行,具体实现如下:
基础R解法
无需额外包,用原生函数即可完成:
set.seed(123) # 固定随机种子,保证结果可重复 id <- c(1,1,1,2,2,3,3,3,3,3,4,5,5,6,6,6) week <- c(1,2,3,1,2,1,2,3,4,5,1,1,2,1,2,3) value <- rnorm(16, mean=5, sd=1) mydf <- data.frame(id, week, value) # 1. 获取所有唯一的个体id unique_ids <- unique(mydf$id) # 2. 随机抽取3个个体(可修改数字调整抽取数量) selected_ids <- sample(unique_ids, 3) # 3. 筛选出选中个体的所有行 sample_df <- mydf[mydf$id %in% selected_ids, ] print(sample_df)
运行后会得到和你示例一致的结果,set.seed(123)固定了随机抽样的种子,确保每次运行都能选中id为1、4、6的个体。
dplyr(tidyverse)解法
如果习惯用tidyverse生态,写法更简洁:
library(dplyr) set.seed(123) sample_df <- mydf %>% # 随机抽取3个id,再筛选对应行 filter(id %in% sample(unique(id), 3)) print(sample_df)
也可以用分组拆分的方式实现:
sample_df <- mydf %>% group_by(id) %>% group_split() %>% # 按id拆分成对应个体的数据框 sample(3) %>% # 随机选3个个体的数据框 bind_rows() # 合并回单个数据框
两种方法都能满足需求:确保选中的个体所有观测行都被完整保留在样本中。
内容的提问来源于stack exchange,提问作者Sointu
相关产品推荐
相关产品推荐

