为R数据帧中相同的列值添加唯一标识符



我有一个数据框架如下:

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

任何建议吗?谢谢你的帮助。

Base 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

tidyverse

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代码,您将看到错误。

Using 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

最新更新