我使用一些非常混乱的字符串,如下所示
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)
最佳答案
您可以使用提取第一个数字
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)
请参见R demo online
细节
.*?
-任意0个以上的字符,尽可能少(\\d[0-9.]*)
-组1捕获任何数字(\\d
),然后捕获0+个数字或.
符号.*
-直到字符串末尾的任何0+字符。sub
函数使用\1
后向引用执行一次替换,该后向引用保留捕获到组1中的值。如果要确保仅提取数字+(
.
+数字)*模式,则可以使用df$Value <- sub(".*?(\\d+(?:\\.\\d+)?).*", "\\1", df$Value)
见this R demo
关于r - R弦清洁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45705428/