R弦清洗
R string cleaning
我正在处理一些非常混乱的字符串,如下所示
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)
来捕获 space 之前的所有内容,但这没有用,因此正在寻找有关如何清理此字符串的一些建议或提示。
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)
您可以使用
提取第一个数字
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
函数执行单个替换,</code> 反向引用持有捕获到组 1 中的值。</p>
<p>如果你想确保你只提取数字(s) + ( <code>.
+ 数字(s) ) * 模式,你可以使用
df$Value <- sub(".*?(\d+(?:\.\d+)?).*", "\1", df$Value)
你可以试试这个:
library("stringr")
str_extract(df$Value, "(\d|\.)+")
我们可以使用 regmatches/regexpr
来自 base R
as.numeric(regmatches(df$Value, regexpr("[0-9][0-9.]*", df$Value)))
我正在处理一些非常混乱的字符串,如下所示
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)
来捕获 space 之前的所有内容,但这没有用,因此正在寻找有关如何清理此字符串的一些建议或提示。
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)
您可以使用
提取第一个数字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
函数执行单个替换,</code> 反向引用持有捕获到组 1 中的值。</p>
<p>如果你想确保你只提取数字(s) + ( <code>.
+ 数字(s) ) * 模式,你可以使用
df$Value <- sub(".*?(\d+(?:\.\d+)?).*", "\1", df$Value)
你可以试试这个:
library("stringr")
str_extract(df$Value, "(\d|\.)+")
我们可以使用 regmatches/regexpr
来自 base R
as.numeric(regmatches(df$Value, regexpr("[0-9][0-9.]*", df$Value)))