R语言:分组后如何标记mappedTerm列的全部重复行?
问题:分组后标记某列存在重复值的所有行
我有一个数据集,希望按var列分组后,将mappedTerm列中存在重复值的所有行在新列rep中标记为“yes”。我使用的代码如下:
vm_check <- vm %>% filter(mappedTerm != ":::UNDEF:::") %>% group_by(var) %>% mutate(rep = if_else(duplicated(mappedTerm), "yes", ""))
但问题是该代码仅标记重复行中的非首行,示例如下:
当前输出:
var1. var2. var3. rep xxx. abc. df1. xxx. abc. df2. yes xxx. abc. df3. yes
期望输出:
var1. var2. var3. rep xxx. abc. df1. yes xxx. abc. df2. yes xxx. abc. df3. yes
现提出两个问题:
- 如何让所有重复行的
rep列都显示“yes”? - 是否有更优的方案实现上述需求?
回答
问题1的解决方案
要标记所有重复行,核心是判断该mappedTerm在当前分组内的出现次数是否大于1,而非仅判断是否是后续重复行。以下两种方法都能实现:
方法1:双向duplicated判断
vm_check <- vm %>% filter(mappedTerm != ":::UNDEF:::") %>% group_by(var) %>% mutate(rep = if_else(duplicated(mappedTerm) | duplicated(mappedTerm, fromLast = TRUE), "yes", "")) %>% ungroup() # 分组操作后建议取消分组,避免后续操作受分组状态影响
逻辑:duplicated(mappedTerm)标记除首次出现外的重复行,duplicated(mappedTerm, fromLast = TRUE)标记除末次出现外的重复行,两者取或就能覆盖所有重复出现的行。
方法2:分组统计出现次数
vm_check <- vm %>% filter(mappedTerm != ":::UNDEF:::") %>% group_by(var, mappedTerm) %>% mutate(rep = if_else(n() > 1, "yes", "")) %>% ungroup()
逻辑:按var+mappedTerm双重分组,用n()统计每组的行数,若行数大于1,说明该mappedTerm在当前var分组内有重复,所有行统一标记为“yes”。
问题2:更优方案推荐
优先推荐上述方法2(双重分组+n()统计),理由如下:
- 可读性更强:直接基于出现次数判断,逻辑直观,不需要理解双向
duplicated的细节 - 性能更稳定:大数据集下,分组统计次数的效率比两次
duplicated判断更高 - 扩展性更好:如果后续需要调整规则(比如标记出现次数≥3的行),只需修改
n()>1为n()≥3即可
内容的提问来源于stack exchange,提问作者Rstudyer
相关产品推荐
相关产品推荐

