如何在第一个字符之前将顺序值添加到已识别的重复项?

How to add sequential values to identified duplicates before first character?

我想识别重复项,然后在第一个字符前添加序号。在下面的脚本中,我确定了重复项

我有一个看起来像这样的数据集

col|
X123
X123
X456
X789
X890
X142
X142
X142


df$col<- ifelse(duplicated(df[,c("col")])|duplicated(df[,c("col")],fromLast = TRUE),
                      make.unique(df$col),df$col)

我的脚本最终做的是这个

col|
X123
X123.1
X456
X789
X890
X142
X142.1
X142.2

我希望它做的是

col|
1X123
2X123
X456
X789
X890
1X142
2X142
3X142

1) 定义一个函数,它在前面加上序列号,然后与 ave 一起使用。

add_seq <- function(x) if (length(x) == 1) x else paste0(seq_along(x), x)
transform(DF, col = ave(col, col, FUN = add_seq))

给予:

    col
1 1X123
2 2X123
3  X456
4  X789
5  X890
6 1X142
7 2X142
8 3X142

2) 下面是一个变体,它使用合并重复的想法,如问题中所示。它给出了相同的结果。

transform(DF, col = (duplicated(col) | duplicated(col, fromLast = TRUE)) |>
                      ifelse(ave(col, col, FUN = seq_along), "") |>
                      paste0(col))

备注

Lines <- "col
X123
X123
X456
X789
X890
X142
X142
X142"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)

这使用 data.table。我们首先通过引用添加两列,id 保存每组的行数,N 保存每组的总行数。然后,如果总行数大于 1,我们将使用 if-else 语句(使用 data.table::fifelse)将 row_number 粘贴到列中。我们按行执行此操作。最后一行删除了温度 idN

library(data.table)

setDT(df)[, `:=`(id=1:.N, N=.N), by=col] %>% 
  .[,col:=fifelse(N>1,paste0(id,col),col), by=1:nrow(df)] %>% 
  .[,`:=`(id=NULL, N=NULL)]

     col
   <char>
1:  1X123
2:  2X123
3:   X456
4:   X789
5:   X890
6:  1X142
7:  2X142
8:  3X142