【问题标题】:How do I take specific numbers from a column in R?如何从 R 中的列中获取特定数字?
【发布时间】:2020-03-28 22:02:48
【问题描述】:

我有一个看起来像这样的 df:

  columnA         B100              Score          Score2
    G01440100208022 10010208022          35            2
    G01330100208023 10010208023          61            4
    G01090100208024 10010208024          48            2
    G01007300129114 10730129114          13            1
    G62117300129121 10730129121          74            6
    G72007300129122 10730129122          63            4

如果columnAG0 开头,我想提取G0 之后的前4 个数字。例如,前三行将是 1440,1330,1090

如果列以 G(number) 开头,例如最后一行 (G7)。我想提取 G 之后的前 5 个数字。例如,这将是 62117, 72007

有谁知道我可以轻松做到这一点吗?理想情况下,最终的 df 看起来像:

columnA         B100              Score          Score2      New
        G01440100208022 10010208022          35            2   1440 
        G01330100208023 10010208023          61            4   1330 
        G01090100208024 10010208024          48            2   1090
        G01007300129114 10730129114          13            1   1007
        G62117300129121 10730129121          74            6   62117
        G72007300129122 10730129122          63            4   72007

【问题讨论】:

    标签: r string dataframe


    【解决方案1】:

    对于多个条件,一个选项可以是 case_when(不过,在这种情况下,还有其他更简单的选项)

    library(stringr)
    library(dplyr)
    df1 %>% 
      mutate(New = case_when(str_detect(columnA, "^G0") ~ 
             str_sub(columnA, 3, 6), TRUE ~ str_sub(columnA,2, 6)))
    #        columnA        B100 Score Score2   New
    #1 G01440100208022 10010208022    35      2  1440
    #2 G01330100208023 10010208023    61      4  1330
    #3 G01090100208024 10010208024    48      2  1090
    #4 G01007300129114 10730129114    13      1  1007
    #5 G62117300129121 10730129121    74      6 62117
    #6 G72007300129122 10730129122    63      4 72007
    

    或者更简单的选择是捕获 'G' 之后的 5 位数字,然后转换为 numeric,这样开头的 0 就会被删除

    df1 %>%
        mutate(New = as.integer( sub("^G(\\d{5}).*", "\\1", columnA)))
    #        columnA        B100 Score Score2   New
    #1 G01440100208022 10010208022    35      2  1440
    #2 G01330100208023 10010208023    61      4  1330
    #3 G01090100208024 10010208024    48      2  1090
    #4 G01007300129114 10730129114    13      1  1007
    #5 G62117300129121 10730129121    74      6 62117
    #6 G72007300129122 10730129122    63      4 72007
    

    或者干脆使用base R

    as.integer( sub("^G(\\d{5}).*", "\\1", df1$columnA))
    #[1]  1440  1330  1090  1007 62117 72007
    

    或者substr

    as.integer(substr(df1$columnA, 2, 6))
    

    数据

    df1 <- structure(list(columnA = c("G01440100208022", "G01330100208023", 
    "G01090100208024", "G01007300129114", "G62117300129121", "G72007300129122"
    ), B100 = c(10010208022, 10010208023, 10010208024, 10730129114, 
    10730129121, 10730129122), Score = c(35L, 61L, 48L, 13L, 74L, 
    63L), Score2 = c(2L, 4L, 2L, 1L, 6L, 4L)), class = "data.frame", 
    row.names = c(NA, 
    -6L))
    

    【讨论】:

    • 感谢您的回复!我正在使用 Rstudio,它说 stringr 适用于 3.3 或更高版本,尽管我刚刚更新到最新的 Rstudio,你知道我该如何解决吗?
    • @Evan 我有R 3.6.2stringr 版本1.4.0。你能更新你的 R 版本吗
    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多