R语言实现数据框抽样:按id与person筛选且保证person列无重复
解决R语言数据抽样:保证person字段无重复的方案
嗨,我来帮你搞定这个抽样需求!你的核心要求很明确:从给定的数据框里筛选出数据,最终结果中每个person只能对应一组完整的id行(也就是同一个person不能出现在多个id的结果里),对吧?
先理清楚你的数据结构:原始数据里,每个person对应连续的3个id(比如Male 1对应id1-3,Male 2对应id4-6),每个id又有3行不同的group值。我们要做的就是给每个person随机挑一个它对应的id,然后保留这个id的所有3行数据,这样就能确保person字段完全不重复。
下面给你两种实用的解决方案:
方法1:用dplyr(推荐,代码更直观)
如果你习惯用tidyverse系列的包,这个方法清晰易懂:
library(dplyr) # 步骤:按person分组→每组随机选一个id→关联回原始数据获取该id的所有行 result <- data %>% # 按person分组,保证每个person单独处理 group_by(person) %>% # 每组随机抽取1行(这样就拿到了该person对应的一个唯一id) slice_sample(n = 1) %>% # 取消分组,方便后续操作 ungroup() %>% # 只保留id和person,用来关联原始数据 select(id, person) %>% # 关联回原始数据,拿到这个id对应的所有3行group数据 inner_join(data, by = c("id", "person"))
运行完后,你可以用unique(result$person)检查,会发现每个person只出现一次,完全符合你的要求。
方法2:用Base R(无需额外加载包)
如果不想加载外部包,用Base R也能轻松实现:
# 步骤:按person拆分id列表→每个person随机选一个id→筛选出对应行 # 1. 把id按person分组拆分 person_id_groups <- split(data$id, data$person) # 2. 对每个person的id列表(去重后)随机选1个id selected_ids <- sapply(person_id_groups, function(ids) sample(unique(ids), 1)) # 3. 从原始数据中筛选出这些id的所有行 result <- data[data$id %in% selected_ids, ]
小提醒
注意你的原始数据里"Female 2 "后面多了一个空格,这可能会导致分组错误(比如把"Female 2"和"Female 2 "当成两个不同的person)。如果是笔误的话,可以先清理一下:
data$person <- trimws(data$person)
这样处理后,不管用哪种方法,都能得到你想要的结果——每个person只对应一个id的完整3行数据,不会出现重复的person。
内容的提问来源于stack exchange,提问作者mmw
相关产品推荐
相关产品推荐

