首页 > 解决方案 > 如何从 R 中的列中获取特定数字?

问题描述

我有一个看起来像这样的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

我想在G0ifcolumnA开头之后提取前 4 个数字G0。例如,这将是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

标签: rstringdataframe

解决方案


一个选项可以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))

推荐阅读