想知道是否有人可以帮我解决这个问题。我在下面有这些数据。
[1] "Compared with 3 months earlier . . . . . . . . 123 (100.0) 11 (8 .9 60 (48. 8) 48 (39.0) 4 (3.3) . . . . . . . . . . . . . ."
[2] "Compared with 3 months earlier . . . . . . . . 124 ( 100.0) 18 (14. 5) 60 (48.4) 42 (33 .9) 4 (3. 2) . . . . . . . . . . . . . ."
[3] "Compared with 3 months earlier . . . . . . . . 124 (100.0) 7 (5.6) 42 (33.9) 64 (51.6) 11 (8.9) . . . . . . . . . . . . . ."
想要提取上面的内容
123 100.0 11 8.9 60 48.8 48 39.0 4 3.3
124 100.0 18 14.5 60 48.4 42 33.9 4 3.2
124 100.0 7 5.6 42 33.9 64 51.6 11 8.9
在数字和小数之间有一些随机空格应该被视为一个单独的数字。我曾尝试使用str_extract_all()
,但它没有给我预期的结果。
答案 0 :(得分:5)
在正则表达式提取之前的一些战术角色替换是有序的,我倾向于在stringi
中“思考”stringr
上的矢量化替换(即使stringr
对矢量化替换有基本支持实际上在封面下使用stringi
:
library(stringi)
mytext <- c("Compared with 3 months earlier . . . . . . . . 123 (100.0) 11 (8 .9 60 (48. 8) 48 (39.0) 4 (3.3) . . . . . . . . . . . . . .",
"Compared with 3 months earlier . . . . . . . . 124 ( 100.0) 18 (14. 5) 60 (48.4) 42 (33 .9) 4 (3. 2) . . . . . . . . . . . . . .",
"Compared with 3 months earlier . . . . . . . . 124 (100.0) 7 (5.6) 42 (33.9) 64 (51.6) 11 (8.9) . . . . . . . . . . . . . .")
# vectorized cleanup
cleaned_text <- stri_replace_all_regex(mytext,
c(" \\.", "\\. ([:digit:])", "Compared with [[:digit:]]+ "),
c("", "\\.\\1", ""),
FALSE)
stri_extract_all_regex(cleaned_text, "[[:digit:]][[:digit:]\\.]*")
## [[1]]
## [1] "123" "100.0" "11" "89" "60" "48.1" "48" "39.0" "4" "3.3"
##
## [[2]]
## [1] "124" "100.0" "18" "14.1" "60" "48.4" "42" "339" "4" "3.1"
##
## [[3]]
## [1] "124" "100.0" "7" "5.6" "42" "33.9" "64" "51.6" "11" "8.9"
希望您可以执行as.numeric()
以及任何其他重塑/转化。
答案 1 :(得分:4)
类似于@hrbrmstr的方法。以hrbrmstr的样本(mytext)为例,我做了以下几点。 gsub()
部分处理您的空间问题。代码中的.(space)
或(space).
已替换为.
。然后,stri_extract_all()
提取所有数字。在您的情况下,您有几个月的数字,这是每个向量中的第一个数字。 lapply(function(x){x[-1]})
删除每个向量中的第一个数字。
library(stringi)
library(magrittr)
gsub(pattern = "\\.\\s|\\s\\.", replacement = "\\.", x = mytext) %>%
stri_extract_all(regex = "\\d+\\.\\d+|\\d+") %>%
lapply(function(x){x[-1]})
#[[1]]
#[1] "123" "100.0" "11" "8.9" "60" "48.8" "48" "39.0" "4" "3.3"
#[[2]]
#[1] "124" "100.0" "18" "14.5" "60" "48.4" "42" "33.9" "4" "3.2"
#[[3]]
#[1] "124" "100.0" "7" "5.6" "42" "33.9" "64" "51.6" "11" "8.9"