Извлечение цифры из строки символов и преобразование ее в число - PullRequest
0 голосов
/ 09 октября 2018

Допустим, у меня есть фрейм данных с векторами A: E, где вектор E выглядит следующим образом:

ABCDEF50GH
ABCDEF600GH
ABCDEF50GH
ABCDEF1000GH

Часть моего кода выглядит следующим образом:

DF <- (filter(DF1, A == "AH") %>%
         mutate(B = nchar(E),
                C = case_when(D == "X" ~ "0",
                              B == 10 ~ substr(E, 7, 8),
                              B == 11 ~ substr(E, 7, 9),
                              B == 12 ~ substr(E, 7, 10),
                              TRUE ~ "0")))

Поэтому я пытаюсь извлечь число из строки.Проблема в том, что извлеченное число является символом, а не числом, поэтому мне нужно использовать другие аргументы case_when в качестве символов.Поэтому вектор C является символьным вектором, и когда я пытаюсь преобразовать его в числовой:

transform(DF, C = as.numeric(levels(C))[C])

, я получаю вектор с символами NA вместо чисел.

Pls help

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Использование stringr для извлечения цифр, а затем просто преобразовать результат в числовой вектор:

library(dplyr)
library(stringr)

sample.df <- data.frame(E = c(
  "ABCDEF50GH",
  "ABCDEF600GH",
  "ABCDEF50GH",
  "ABCDEF1000GH"
), 
stringsAsFactors = FALSE)

sample.df <- sample.df %>%
  mutate(E_numbers = str_extract_all(E, "[[:digit:]]+")) %>%
  mutate(E_numbers = unlist(E_numbers)) %>% 
  mutate(E_numbers = as.numeric(E_numbers))

> sample.df
             E E_numbers
1   ABCDEF50GH        50
2  ABCDEF600GH       600
3   ABCDEF50GH        50
4 ABCDEF1000GH      1000

str_extract_all() возвращает список, который может быть сложно обработать, поэтому я использую unlist() прочеечем это, это должно быть просто:)

Примечание: разница между str_extract_all() и str_extract() в том, что str_extract() будет ловить только первое число в ваших строках.Таким образом, если одна из строк в E будет "ABCDEF600G400H", str_extract_all() вернет числа 600 и 400, а str_extract() вернет 600.Не уверен, что является предпочтительным в вашем случае.

Редактировать: Если вы хотите извлечь только последнее число в "ABCDEF600G400H", мы можем использовать пакет stringi вместо stringr:

library(dplyr)
library(stringi)

sample.df <- data.frame(
  E = c(
    "ABCDEF50GH",
    "ABCDEF600GH",
    "ABCDEF50GH",
    "ABCDEF1000GH",
    "ABCDEF600G400H"
  ), stringsAsFactors = FALSE)

sample.df <- sample.df %>%
  mutate(E_numbers = stri_extract_last_regex(E, "[[:digit:]]+")) %>%
  mutate(E_numbers = unlist(E_numbers)) %>% 
  mutate(E_numbers = as.numeric(E_numbers))
> sample.df
               E E_numbers
1     ABCDEF50GH        50
2    ABCDEF600GH       600
3     ABCDEF50GH        50
4   ABCDEF1000GH      1000
5 ABCDEF600G400H       400
0 голосов
/ 09 октября 2018

данные: заимствовано у JBGruber

sample.df <- data.frame(
    E = c(
        "ABCDEF50GH",
        "ABCDEF600GH",
        "ABCDEF50GH",
        "ABCDEF1000GH",
        "ABCDEF600G400H"
    ), stringsAsFactors = FALSE)

базовое решение для извлечения последнего числа:

m <- gregexpr("\\d+(?=\\D+$)",text = sample.df$E, perl = T)
sample.df$E_numbers <- as.numeric(regmatches(sample.df$E, m))

результат:

#               E E_numbers
#1     ABCDEF50GH        50
#2    ABCDEF600GH       600
#3     ABCDEF50GH        50
#4   ABCDEF1000GH      1000
#5 ABCDEF600G400H       400
0 голосов
/ 09 октября 2018

вы можете сделать это с помощью пакета stringr

text <- as.data.frame(c("ABCDEF50GH",
    "ABCDEF600GH",
              "ABCDEF50GH",
              "ABCDEF1000GH"))
colnames(text)<-c("names")

library(stringr )
text$numerics <-  str_extract(text$names,  "[[:digit:]]+")

, если вы хотите преобразовать его в числовое значение, просто добавьте как .numeric

text$numerics <-  as.numeric(str_extract(text$names,  "[[:digit:]]+"))
...