如何在第一个字符之前将顺序值添加到已识别的重复项?
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 粘贴到列中。我们按行执行此操作。最后一行删除了温度 id
和 N
列
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
我想识别重复项,然后在第一个字符前添加序号。在下面的脚本中,我确定了重复项
我有一个看起来像这样的数据集
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 粘贴到列中。我们按行执行此操作。最后一行删除了温度 id
和 N
列
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