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
相关产品推荐
相关产品推荐

