2012-11-12 37 views
2

我有一个包含国际格式数字(即字符串)的文件,其中包括测量单位。在这种情况下,小数位用“,”表示,1e3分隔符表示为“。”。 (即德国数字格式)。将国际格式的字符串转换为数字

a <- c('2.200.222 €', 
     ' 180.109,3 €') 

b <- c('28,42 m²', 
     '47,70 m²') 

我想这些字符串高效地转换成numeric。我试着通过代码像

require(stringr) 
str_extract(a, pattern='[0-9]+.[0-9]+.[0-9]+') 
str_extract(b, pattern='[0-9]+,[0-9]+') 

但是过滤掉的数字,这似乎太容易出错,我想必须有一个更加规范的方式。所以这里是我的问题:是否有一个自定义函数,包或其他能够解决这个问题的东西?

非常感谢!

+0

你可能会讨论一些你看到的错误吗? –

+0

其实我不确定如何指定正则表达式。例如,“[0-9] +。[0-9] +。[0-9] +,[0-9] +”对于所有情况都可以吗?例如对于像'c('23,3')'这样的数字与'c'('12l.120.222.23,3')'相比,实际上我想知道一般情况下是否存在这种情况的函数。谢谢! – Seb

+1

'taRifx :: destring'就像你想要的一样。 –

回答

5

下面是一个使用gsub对付你张贴的样本数据的功能:

x <- c('2.200.222 €', ' 180.109,3 €', '28,42 m²', '47,70 m²') 

strip <- function(x){ 
    z <- gsub("[^0-9,.]", "", x) 
    z <- gsub("\\.", "", z) 
    gsub(",", ".", z) 
} 

as.numeric(strip(x)) 
[1] 2200222.00 180109.30  28.42  47.70 

它的工作原理是这样的:

  1. 首先去掉所有尾随非数字(和任何后面的这些非数字)
  2. 然后剥去所有时期。
  3. 最后,将逗号转换为句点。
+2

你的第一个正则表达式只需要''[^ 0-9,。] +“' – hadley

+0

@hadley所以它的确如此,谢谢。 – Andrie

+0

另外,您不需要在第3个正则表达式中替换中的'.'。 – hadley

相关问题