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))
为啥你之前的代码不符合需求?
之前的代码有两个问题:
- 硬绑定了
email列,没法灵活切换到其他列; - 用
1:n()生成Flag再判断,其实是标记“非首次出现的行”,而不是“所有存在重复值的行”,逻辑和你要的不一致。
现在用上面的方案就能轻松实现你要的功能啦!
内容的提问来源于stack exchange,提问作者newcomer
相关产品推荐
相关产品推荐

