【问题标题】:How to create a unique identifier based on other column in R如何基于 R 中的其他列创建唯一标识符
【发布时间】:2021-04-27 20:27:07
【问题描述】:

我有一个包含五千行的数据框。我需要创建一个新列,其具有基于“性别”列的唯一标识符,然后是数字 21,以及从 0001 开始的序号。重要的是,序号在“性别”列中以不同的字母重新开始(性别+ 21 + seq#)。

df <- data_frame(
  name = c("A", "B", "C", "D", "E", "F", "G", "H", "I"),
  gender = c("F", "F", "F", "M","M","F","M","F","F")
)

df
name  gender
  <chr> <chr> 
1 A     F     
2 B     F     
3 C     F     
4 D     M     
5 E     M     
6 F     F     
7 G     M     
8 H     F     
9 I     F

具有唯一标识符:

df
name  gender  id
1 A     F     F210001
2 B     F     F210002
3 C     F     F210003
4 D     M     M210001
5 E     M     M210002
6 F     F     F210004
7 G     M     M210003
8 H     F     F210005
9 I     F     F210006

任何有关如何实现这一目标的帮助将不胜感激。

【问题讨论】:

    标签: r unique-id


    【解决方案1】:

    一个选项是pasterowid

    library(dplyr)
    library(stringr)
    library(data.table)
    df1 <- df %>% 
              mutate(id = str_c(gender, rowid(gender) + 210000))
    

    或者做一个group_by/row_number

    df1 <- df %>%
            group_by(gender) %>%
            mutate(id = str_c(cur_group(), row_number() + 210000)) %>%
            ungroup
    

    【讨论】:

    • 您可以使用row_number() 消除data.table 依赖(如果您是group_by 性别)。添加的好主意 - 我正在使用 str_pad 编写解决方案,但这更干净。
    【解决方案2】:

    在基础 R 中,您可以使用 ave:

    transform(df, group = ave(gender, gender, FUN = function(x)sprintf("%s21%04d",x,seq(x))))
    
      name gender   group
    1    A      F F210001
    2    B      F F210002
    3    C      F F210003
    4    D      M M210001
    5    E      M M210002
    6    F      F F210004
    7    G      M M210003
    8    H      F F210005
    9    I      F F210006
    

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多