2014-01-09 163 views
5

我有一整列数字,其中包括在数千和逗号点分隔符而不是作为一个dismal分隔符。当我尝试从它们中创建数字列时,我会丢失所有数据。在R中替换逗号和点

var1 <- c("50,0", "72,0", "960,0", "1.920,0", "50,0", "50,0", "960,0") 
df <- cbind(var1, var2 = as.numeric(gsub(".", "", as.character(var1)))) 

和伤口了:

var1  var2 
[1,] "50,0" NA 
[2,] "72,0" NA 
[3,] "960,0" NA 
[4,] "1.920,0" NA 
[5,] "50,0" NA 
[6,] "50,0" NA 
[7,] "960,0" NA 

我在做什么错?

回答

25

您需要在正则表达式中跳过".",并且您需要用"."替换逗号,然后才能将其转换为数字。

> as.numeric(gsub(",", ".", gsub("\\.", "", var1))) 
[1] 50 72 960 1920 50 50 960 
+1

''格式( '' VAR1,decimal.mark =)''是改变逗号进入点的另一种方式。不能说利弊,这只是一个方面的评论。 – PatrickT

+0

当我将这个函数传递给一个数字向量时,它返回错误'使用方法中的错误(“filter_”): 对于类“c('double','numeric')”的对象应用'filter_' – d8aninja

3

对于像这样的事物,我最喜欢scan(),因为它很容易理解。只需使用

scan(text=var1, dec=",", sep=".") 

唉,这不是比gsub(),这在另一方面seemes制服更快。因此彼此,速度快,选项sub()

as.numeric(sub(",", ".", sub(".", "", var1, fixed=TRUE), fixed=TRUE)) 

以防万一:read.table("file.txt", dec=",", sep=".")

0

您可以使用:当你从文件中直接读取var1,只要用指定的分隔符读它函数“type_convert”,来自“readr”包。我读的ODS文件(区域设置葡萄牙)和转换的数字:

library('readODS') 
library('tidyverse') 
data <- read_ods('mod-preditivo.ods', sheet=1,col_names = TRUE,range='a1:b30',col_types=NA) 
df <- type_convert(data,trim_ws=TRUE,col_types = cols(Pesos=col_integer(),Alturas=col_double()),locale = locale(decimal_mark = ",")) 
str(df)