我使用一些非常混乱的字符串,如下所示

 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/

10-12 22:38