Как мне взять определенные c числа из столбца в R? - PullRequest
1 голос
/ 29 марта 2020

У меня есть 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

, и я хотел бы извлечь первые 4 числа после G0, если columnA начинается с G0. Например, это будет 1440,1330,1090 для первых трех строк.

Если столбец начинается с G (число), например, последней строки (G7). Я хотел бы извлечь первые 5 чисел после G. Например, это будет 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

1 Ответ

1 голос
/ 29 марта 2020

Один вариант может быть 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

Или более простым вариантом является захват 5 цифр после 'G', а затем преобразовать в 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))

data

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...