从字符串中提取数字并将其转换为数字
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 数字 600
和 400
而 str_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
假设我有一个包含向量 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 数字 600
和 400
而 str_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