R字符串清洁

时间:2017-08-16 05:03:10

标签: r regex string gsub data-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)来捕获空间之前的所有内容但是没有用,所以寻找一些关于如何清理这个字符串的建议或提示。

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) 

3 个答案:

答案 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)

请参阅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

答案 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)))