将唯一标识符添加到 R 数据框中的同一列值

Add a unique identifier to the same column value in R data frame

我有一个数据框如下:

     index val  sample_id
1     1    14      5
2     2    22      6
3     3    1       6
4     4    25      7
5     5    3       7
6     6    34      7

对于带有 sample_id 的每一行,我想添加一个唯一标识符,如下所示:

index val  sample_id
1     1    14      5
2     2    22      6-A
3     3    1       6-B
4     4    25      7-A
5     5    3       7-B
6     6    34      7-C

有什么建议吗?感谢您的帮助。

基础 R

dat$id2 <- ave(dat$sample_id, dat$sample_id,
               FUN = function(z) if (length(z) > 1) paste(z, LETTERS[seq_along(z)], sep = "-") else as.character(z))
dat
#   index val sample_id id2
# 1     1  14         5   5
# 2     2  22         6 6-A
# 3     3   1         6 6-B
# 4     4  25         7 7-A
# 5     5   3         7 7-B
# 6     6  34         7 7-C

整洁宇宙

library(dplyr)
dat %>%
  group_by(sample_id) %>%
  mutate(id2 = if (n() > 1) paste(sample_id, LETTERS[row_number()], sep = "-") else as.character(sample_id)) %>%
  ungroup()

小提示:从一个或两个代码块中删除 as.character(z) 可能很诱人。首先,什么都不会改变(这里):基础 R 允许你有点草率;如果我们依赖于此并且需要新字段始终是character,那么在那种一种罕见的情况中,所有行都具有唯一性sample_id,则该列将保持 integerdplyr 对此要小心得多;如果你 运行 没有 as.character 的 tidyverse 代码,你会看到错误。

使用 dplyr:

library(dplyr)

dplyr::group_by(df, sample_id) %>% 
  dplyr::mutate(sample_id = paste(sample_id, LETTERS[seq_along(sample_id)], sep = "-"))

 index   val sample_id
  <int> <dbl> <chr>    
1     1    14 5-A      
2     2    22 6-A      
3     3     1 6-B      
4     4    25 7-A      
5     5     3 7-B      
6     6    34 7-C 

如果您只想为同一个 sample_id 创建独特的标签,也许您可​​以像下面那样尝试 make.unique

transform(
  df,
  sample_id = ave(as.character(sample_id),sample_id,FUN = function(x) make.unique(x,sep = "_"))
)

这给出了

  index val sample_id
1     1  14         5
2     2  22         6
3     3   1       6_1
4     4  25         7
5     5   3       7_1
6     6  34       7_2