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

R语言中如何将数据框重复条目替换为n减去超出2次的重复次数

数据框指定列重复条目按规则替换实现

需求描述

我的数据某一列存在重复条目,我希望实现的逻辑是:若某条目n在列内重复出现超过2次,则将该条目替换为*n-(重复出现次数 - 2)*。

示例数据

现有数据结构如下:

df <- data.frame(
  A = c(1,2,2,4,5,7,7,7,7,2,8,8),
  B = c(2,3,4,5,6,7,8,9,10,11,12,13)
)
> df
A  B
1  2
2  3
2  4
4  5
5  6
7  7
7  8
7  9
7 10
2 11
8 12
8 13

规则说明

  • df$A列中7共重复出现4次,超过2次的部分需要替换:第1、2次出现的7保持不变,第3次出现的7替换为7 - (3-2),第4次出现的7替换为7 - (4-2)。
  • df$A列中2共重复出现3次,按照相同规则,第3次出现的2替换为2 - (3-2)。
  • df$B列无重复值,因此保持原样不变。

期望输出

最终需要得到的结果如下:

dfNew <- data.frame(
  A = c(1,2,2,4,5,7,7,6,5,1,8,8),
  B = c(2,3,4,5,6,7,8,9,10,11,12,13)
)
> dfNew
A  B
1  2
2  3
2  4
4  5
5  6
7  7
7  8
6  9
5 10
1 11
8 12
8 13

实现方案

方案1:dplyr包实现(推荐,可读性高)

library(dplyr)

dfNew <- df %>%
  group_by(A) %>%
  mutate(
    appear_cnt = row_number(),
    A = ifelse(appear_cnt > 2, A - (appear_cnt - 2), A)
  ) %>%
  ungroup() %>%
  select(-appear_cnt)

方案2:基础R实现(无需额外依赖)

appear_cnt <- ave(df$A, df$A, FUN = seq_along)
df$A <- ifelse(appear_cnt > 2, df$A - (appear_cnt - 2), df$A)
dfNew <- df

以上两种方案运行后输出结果均与预期一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:54:03