【问题标题】:Add a unique identifier to the same column value in R data frame将唯一标识符添加到 R 数据框中的同一列值
【发布时间】:2021-02-01 21:40:39
【问题描述】:

我有一个数据框如下:

     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 data-manipulation uniqueidentifier


    【解决方案1】:

    基础 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 在防范这个方面要小心得多;如果你在没有as.character 的情况下运行tidyverse 代码,你会看到错误。

    【讨论】:

    • @markus 迭代和完善,感谢您的建议:-)
    【解决方案2】:

    使用 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 
    

    【讨论】:

    • 整洁。谢谢。
    【解决方案3】:

    如果您只想为相同的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
    

    【讨论】:

    • 非常有用的解决方案。就我而言,我必须使用 -A 和 -B 来区分这些重复。谢谢。
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多