【问题标题】:Recode character IDs into numeric IDs将字符 ID 重新编码为数字 ID
【发布时间】:2021-11-17 20:15:26
【问题描述】:

我需要修改一个id 变量值。示例数据如下所示:

df <- data.frame(id = c(11,21,22,"33_AS_A","33_AS_B","33_AS_X", "35_Part1","35_Part2","35_Part4","35_Part7"),
                 Grade= c(3,3,3, 4,4,4,5,5,5,5))

> df
         id Grade
1        11     3
2        21     3
3        22     3
4   33_AS_A     4
5   33_AS_B     4
6   33_AS_X     4
7  35_Part1     5
8  35_Part2     5
9  35_Part4     5
10 35_Part7     5

我需要将id 重新编码为数字变量,方法是按顺序给出有序的数值而不是文本值。

这是我想要的输出:

> df2
    id Grade
1   11     3
2   21     3
3   22     3
4  331     4
5  332     4
6  333     4
7  351     5
8  352     5
9  353     5
10 354     5

有什么想法吗?

【问题讨论】:

    标签: r recode


    【解决方案1】:
    library(dplyr)
    library(stringr)
    df %>%
      mutate(
        group = str_extract(id, "[0-9]+")
      ) %>%
      group_by(group) %>%
      mutate(id = as.numeric(paste0(group, if(n() > 1) row_number() else ""))) %>%
      ungroup() %>%
      select(-group)
    # # A tibble: 10 × 2
    #      id Grade
    #   <dbl> <dbl>
    # 1    11     3
    # 2    21     3
    # 3    22     3
    # 4   331     4
    # 5   332     4
    # 6   333     4
    # 7   351     5
    # 8   352     5
    # 9   353     5
    #10   354     5
    

    【讨论】:

      【解决方案2】:

      使用base,根据数字进行分组,如果分组长度不为1,则添加行号:

      x <- sapply(strsplit(df$id, "_"), `[`, 1)
      
      df$ID <- unlist(sapply(split(x, x), function(i) 
        if(length(i) == 1) i else paste0(i, seq(i))))
      
      df
      #           id Grade  ID
      #  1        11     3  11
      #  2        21     3  21
      #  3        22     3  22
      #  4   33_AS_A     4 331
      #  5   33_AS_B     4 332
      #  6   33_AS_X     4 333
      #  7  35_Part1     5 351
      #  8  35_Part2     5 352
      #  9  35_Part4     5 353
      # 10  35_Part7     5 354
      

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2016-06-19
        • 1970-01-01
        相关资源
        最近更新 更多