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

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

现提出两个问题:

  1. 如何让所有重复行的rep列都显示“yes”?
  2. 是否有更优的方案实现上述需求?

回答

问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:15:43