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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:02:28