假设我有一个带有向量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而不是数字的向量。
请帮助
答案 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()
将返回数字600
和400
,而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