如何在R中按id对data frame取子集,每个id仅采样1行?
DataFrame按id列去重(每个id仅保留1行)实现方案
你可以根据使用的工具选择对应实现方法:
Python Pandas 实现
- 基础通用方法,直接调用
drop_duplicates方法即可,默认保留每个id第一次出现的行:
df_unique = df.drop_duplicates(subset="codigo_pon", keep="first")
- 参数调整说明:
- 若要保留每个id最后一次出现的行,将
keep参数改为"last" - 若不需要保留原df,可添加
inplace=True参数直接修改原对象,节省内存
- 若要保留每个id最后一次出现的行,将
- 大体量DataFrame优化方案:如果数据量极大内存占用较高,可以先提取待保留的索引再过滤,减少中间内存开销:
# 先获取所有唯一id的首次出现行索引 keep_idx = df["codigo_pon"].drop_duplicates(keep="first").index # 按索引过滤得到去重结果,重置行索引 df_unique = df.loc[keep_idx].reset_index(drop=True)
R 语言实现
- 使用dplyr包的
distinct方法实现:
library(dplyr) # 按codigo_pon去重,保留所有列 df_unique <- df %>% distinct(codigo_pon, .keep_all = TRUE)
注意:如果需要保留每个id满足特定规则的行(如数值最大、时间最新等),可以先按照对应字段排序后再执行去重操作,此时keep="first"会默认保留排序后优先级最高的行。
内容的提问来源于stack exchange,提问作者João Reis
相关产品推荐
相关产品推荐

