如何提取数据框中ID重复的整行至新变量?R语言技术问询
提取数据中所有重复ID的行
首先,你不用纠结if语句啦——R里处理这种整行筛选的场景,用向量化操作会比循环/if判断高效得多,而且逻辑更清晰。
你的需求是保留所有ID不唯一的行(也就是ID出现次数≥2的所有对应行),可以按以下步骤来:
步骤1:创建标记重复行的逻辑向量
我们需要找出所有ID重复的行,包括第一次出现的那行(默认duplicated()只会标记后续重复的行)。可以结合正序和倒序的duplicated()结果:
# 生成逻辑向量:标记所有ID重复的行 is_dup <- duplicated(my_data$id) | duplicated(my_data$id, fromLast = TRUE)
duplicated(my_data$id):从前往后看,标记非首次出现的重复ID行duplicated(my_data$id, fromLast = TRUE):从后往前看,标记非末次出现的重复ID行- 用
|(逻辑或)组合后,就能得到所有ID出现次数≥2的行的标记
步骤2:筛选出目标行
直接用这个逻辑向量去筛选你的数据框即可:
# 提取所有重复ID对应的行 duplicated_rows <- my_data[is_dup, ]
举个实际例子验证
假设你的原始数据是这样的:
my_data <- data.frame( month = c(1, 1, 1), year = c(2014, 2014, 2014), id = c(20, 305, 305) )
运行上面的代码后,duplicated_rows的结果就是你想要的:
month year id 2 1 2014 305 3 1 2014 305
为什么不用if语句?
你之前写的if(duplicated(my_data$id) = TRUE)有两个小问题:
- 比较相等应该用
==,而不是赋值的= if语句只能处理单个逻辑值,但duplicated()返回的是和数据行数一样的逻辑向量,直接用if会报错。R的优势就是向量化操作,直接用向量筛选比循环判断简洁高效得多。
内容的提问来源于stack exchange,提问作者Jack_Carver
相关产品推荐
相关产品推荐

