首页 > 解决方案 > 将唯一标识符添加到 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

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

标签: rdata-manipulationuniqueidentifier

解决方案


碱基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)小提示:从一个或两个代码块中删除 可能很诱人。首先,什么都不会改变(这里):base R 让你有点马虎;如果我们依赖它并且需要新字段始终存在character,那么在所有行都具有唯一性的罕见情况下sample_id,该列将保留integerdplyr在防止这种情况下要小心得多;如果您在没有 的情况下运行 tidyverse 代码as.character,您将看到错误。


推荐阅读