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

时间:2018-10-09 06:54:35

标签: r string dataformat

假设我有一个带有向量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_w的其他参数也设置为字符。 因此,向量C是一个字符向量,当我尝试将其转换为数字时:

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

我得到一个带有NA而不是数字的向量。

请帮助

3 个答案:

答案 0 :(得分:1)

您可以使用纵梁包

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:]]+"))

答案 1 :(得分:0)

使用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()将返回数字600400,而str_extract()将返回{{1 }}。不知道哪种情况适合您。

编辑:如果您只想提取600中的最后一个数字,我们可以使用"ABCDEF600G400H"包而不是stringi

stringr

答案 2 :(得分:0)

数据:从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