如何在R语言中标记重复值的重复出现次数?
嘿,这个需求我之前处理重复数据的时候也遇到过,其实不用局限在duplicated()的结果上,咱们换个思路,直接给每个重复组做累计计数,就能轻松得到每个值是第几次出现啦!下面给你几种实用的实现方式:
实现思路与代码示例
核心逻辑是按值分组后累计计数:不管是用tidyverse工具还是基础R,只要能给每个相同值的元素分配一个“出现序号”,就能直接得到你要的重复次数(第一次重复对应序号2,或者你可以调整成从1开始计数)。
方法1:用dplyr(简洁易读,适合tidyverse用户)
如果你平时习惯用tidyverse系列包,dplyr的分组+突变操作非常直观:
library(dplyr) # 示例数据 test_list <- c("A", "B", "A", "A", "C", "B") # 给每个值添加出现序号 result_df <- tibble(value = test_list) %>% group_by(value) %>% mutate(repeat_count = row_number()) %>% # 每个组内的序号,第一次出现是1,第二次是2... ungroup() # 如果你只需要重复项(也就是非第一次出现的元素) duplicates_with_index <- result_df %>% filter(repeat_count > 1)
这里的repeat_count就是每个值的出现次数,要是你想把“第一次重复”标记为1,只需要改成repeat_count - 1就行。
方法2:基础R实现(无需额外包)
不想加载第三方包的话,用基础R的ave()函数就能搞定,它专门用来按组计算:
# 示例数据 test_list <- c("A", "B", "A", "A", "C", "B") # 计算每个值的出现序号 repeat_count <- ave(seq_along(test_list), test_list, FUN = seq_along) # 组合成数据框查看 result_df <- data.frame( original_value = test_list, repeat_count = repeat_count ) # 提取重复项 duplicates_with_index <- result_df[repeat_count > 1, ]
ave()会自动把test_list按相同值分组,对每个组的位置生成连续序号,效果和dplyr完全一致。
结合你已有的dups变量
如果你已经生成了dups <- duplicated(test_list),也可以基于这个结果来生成重复次数:
# 先获取所有重复项的位置 dup_positions <- which(dups) # 提取这些位置对应的原数值 dup_values <- test_list[dup_positions] # 给这些重复值按组计数(第一次重复是1,第二次是2...) dup_repeat_times <- ave(seq_along(dup_values), dup_values, FUN = seq_along) # 最终结果:位置、值、重复次数 final_result <- data.frame( position = dup_positions, value = dup_values, repeat_time = dup_repeat_times )
小提醒
- 如果你的
test_list是数据框中的一列,只需要把代码里的向量替换成列名(比如df$your_column)就行。 - 要是你需要的是“累计出现次数(包含第一次)”,直接用
repeat_count;如果要的是“重复的次数(从1开始算第一次重复)”,就用repeat_count - 1。
内容的提问来源于stack exchange,提问作者Chu
相关产品推荐
相关产品推荐

