我使用了一些非常混乱的字符串,如下所示
Value
-------------------
25
32.12 . (05-
33.90 ,
46.70 ,
() 26.60
27.2
23.24 . (12-
36.52 ,
27.1814404432133 [
29.73 . (22-
31.8058003525076 [
35.40 ,
38.44 .
46.14 ,
29.26 [
25.44 .
我不确定如何有效地清理它,使其看起来像这样。
Value
-------------------
25
32.12
33.90
46.70
26.60
27.2
23.24
36.52
27.1814404432133
29.73
31.8058003525076
35.40
38.44
46.14
29.26
25.44
我尝试使用子函数sub(" .*", '', Value)
来捕获空间之前的所有内容但是没有用,所以寻找一些关于如何清理这个字符串的建议或提示。
Value <- c(" 25 \n", " 32.12 . (05-", "33.90 ,\n", "46.70 ,\n", " () 26.60 ",
" 27.2 ", " 23.24 . (12-", "36.52 ,\n", " 27.1814404432133\n\n[",
" 29.73 . (22-", " 31.8058003525076\n\n[", "35.40 ,\n", " 38.44 .\n",
"46.14 ,\n", " 29.26\n\n[", " 25.44 .\n")
df <- data.frame(Value)
答案 0 :(得分:3)
您可以使用
提取第一个数字Value <- c(" 25 \n", " 32.12 . (05-", "33.90 ,\n", "46.70 ,\n", " () 26.60 ",
" 27.2 ", " 23.24 . (12-", "36.52 ,\n", " 27.1814404432133\n\n[",
" 29.73 . (22-", " 31.8058003525076\n\n[", "35.40 ,\n", " 38.44 .\n",
"46.14 ,\n", " 29.26\n\n[", " 25.44 .\n")
df <- data.frame(Value)
df$Value <- sub(".*?(\\d[0-9.]*).*", "\\1", df$Value)
<强>详情
.*?
- 任意0个字符,尽可能少(\\d[0-9.]*)
- 第1组捕获任何数字(\\d
),然后是0+数字或.
符号.*
- 字符串末尾的任何0 +字符。 sub
函数使用\1
反向引用执行单个替换,并将捕获的值保存到组1中。
如果你想确保只提取数字+(.
+数字)*模式,你可以使用
df$Value <- sub(".*?(\\d+(?:\\.\\d+)?).*", "\\1", df$Value)
请参阅this R demo
答案 1 :(得分:2)
你可以试试这个:
library("stringr")
str_extract(df$Value, "(\\d|\\.)+")
答案 2 :(得分:0)
我们可以使用regmatches/regexpr
base R
as.numeric(regmatches(df$Value, regexpr("[0-9][0-9.]*", df$Value)))