从字符串中提取数字并将其转换为数字

Extracting digit from character string and transforming it to a number

假设我有一个包含向量 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 而不是数字的向量。

请帮忙

你可以使用 stringr 包

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

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

如果你想将其转换为数字,只需添加 as.numeric

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

使用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() return 是一个很难处理的列表,因此我使用 unlist() 除此之外,它应该很简单:)

注意:str_extract_all()str_extract() 的区别在于 str_extract() 只会捕获字符串中的第一个数字。因此,如果 E 中的字符串之一是 "ABCDEF600G400H"str_extract_all() 将 return 数字 600400str_extract() 将return600。不确定您的情况更可取。

编辑:如果您只想提取 "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

数据:借自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