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

R语言:如何为数据框生成1/0格式的重复值标记列

我来帮你搞定这个问题!你需要的是一个能针对任意指定列生成重复标记的通用方案,而不是只能固定处理email列对吧?而且从需求来看,你是想把所有存在重复值的行都标1(比如某个emp_id出现多次,那这几行都标记为1),唯一值的行标0,对吧?

先看你的示例数据,我先把它重新贴出来方便测试:

df4 <- data.frame(
  emp_id = c("DEV-2962","KTN_2252","ANA2719","ITI_2624","DEV2698","HRT2921","","KTN2624","DEV2698","ITI2535","DEV2698","HRT2837","ERV2951","KTN2542","ANA2813","ITI2210"),
  email = c("akash.dev@abcd.com","rahul.singh@abcd.com","salman.abbas@abcd.com","ram.lal@abcd.com","ram.lal@xyz.com","prabal.garg@xyz.com","sanu.ali@abcd.com","kunal.singh@abcd.com","lakhan.tomar@abcd.com","praveen.thakur@abcd.com","sarman.ali@abcd.com","zuber.khan@dkl.com","giriraj.singh@dkl.com","lokesh.sharma@abcd.com","pooja.pawar@abcd.com","nikita.sharma@abcd.com")
)

方案一:标记所有重复值的行(只要值重复,所有对应行标1)

这个方案用dplyr实现,还能写成通用函数,想检查哪列就传哪列:

library(dplyr)

# 写一个通用函数,传入数据框和要检查的列名
mark_duplicates <- function(df, target_col) {
  df %>%
    group_by({{target_col}}) %>%  # 用{{}}直接引用列名,不用手动转sym,更简洁
    mutate(
      Duplicate_flag = ifelse(n() > 1, 1, 0)  # 组内行数>1,说明有重复,标1;否则标0
    ) %>%
    ungroup()
}

# 示例1:给emp_id列加重复标记
df4_emp_dup <- mark_duplicates(df4, emp_id)

# 示例2:给email列加重复标记
df4_email_dup <- mark_duplicates(df4, email)

比如emp_id里的DEV2698出现了3次,这三行的Duplicate_flag都会是1;而只出现一次的KTN_2252就会是0,完全符合你的需求。

方案二:标记重复出现的行(首次出现标0,后续重复行标1)

如果你想要的是另一种逻辑:第一次出现的行标0,之后重复的行标1,那用base R的duplicated()函数更简单:

# 给emp_id列加标记:首次出现0,重复出现1
df4 <- df4 %>% mutate(Duplicate_emp = ifelse(duplicated(emp_id), 1, 0))

# 给email列加标记同理
df4 <- df4 %>% mutate(Duplicate_email = ifelse(duplicated(email), 1, 0))

为啥你之前的代码不符合需求?

之前的代码有两个问题:

  1. 硬绑定了email列,没法灵活切换到其他列;
  2. 用1:n()生成Flag再判断,其实是标记“非首次出现的行”,而不是“所有存在重复值的行”,逻辑和你要的不一致。

现在用上面的方案就能轻松实现你要的功能啦!

内容的提问来源于stack exchange,提问作者newcomer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:07:32