如何为去重后的DataFrame重新关联原始分组列?
问题解决方法
问题场景
我有两个大型数据集:一个是移除分组列并去重后的数据集,另一个是原始数据集。完成数据处理/机器学习操作后,需要将原始数据集中的分组列重新关联到去重后的数据集。以iris数据集复现问题如下:
# 用iris数据集模拟含重复项的真实数据 # 重复第1行20次 iris1 <- rbind(iris, iris[rep(1, 20), ]) # 移除Species列并去重的新数据集 iris_rm <- subset(iris1, select = -c(Species) ) iris_rm <- iris_rm[!duplicated(iris_rm), ] # 此处进行数据分析/机器学习操作... # 尝试忽略Species列做semi_join,再补列失败(行长度不匹配) library(dplyr) new <- semi_join(iris_rm, iris1[,-5], by = NULL) new['Species2']= iris1['Species'] # 此方法无效
核心需求:
- 执行关联时忽略Species列,但结果中要保留该列
- 数据存在特征列相同但Species列不同的非完全重复行
解决方案
不用拆分关联和补列两步,直接通过关联操作一次性保留Species列:
方法1:直接关联去重特征集与原始数据集
library(dplyr) # 生成去重后的特征集(不含Species) iris_rm <- iris1 %>% select(-Species) %>% distinct() # 以特征列为连接键,关联原始数据集,自动保留Species列 # inner_join会返回所有特征匹配的行(包括同一特征对应不同Species的情况) new <- inner_join(iris_rm, iris1, by = names(iris_rm)) # 若需每个特征组合只保留唯一的Species(按需选择) new_unique_species <- new %>% distinct(across(-Species), .keep_all = TRUE)
方法2:已完成分析后补全Species列
如果已经对iris_rm完成了数据分析,直接用left_join关联原始数据集即可:
# 基于已处理的iris_rm补全Species列 new_with_species <- iris_rm %>% left_join(iris1, by = names(iris_rm)) # 按需处理同一特征对应多Species的情况: # 比如保留所有对应Species new_all_species <- new_with_species %>% distinct() # 或者只保留每个特征的第一个Species new_first_species <- new_with_species %>% distinct(across(-Species), .keep_all = TRUE)
关键说明
- 用
names(iris_rm)作为连接键,避免手动指定列名,适配任意特征列数量的数据集 - 针对“特征相同但Species不同”的场景,
inner_join/left_join会保留所有匹配结果,可通过distinct按需去重或筛选
内容的提问来源于stack exchange,提问作者MM1
相关产品推荐
相关产品推荐

