web-dev-qa-db-ja.com

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 

私は何を間違えていますか?

11
Nils Olve

正規表現で"."をエスケープする必要があり、数値に変換する前にコンマを"."に置き換える必要があります。

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

これらのようなものについては、scan()が最も好きです。理解しやすいからです。使うだけ

_scan(text=var1, dec=",", sep=".")
_

残念ながら、それはgsub()より高速ではありません。したがって、別の高速なオプションはsub()です。

_as.numeric(sub(",", ".", sub(".", "", var1, fixed=TRUE), fixed=TRUE))
_

念のため:ファイルから_var1_を直接読み取る場合は、指定された区切り文字を使用して読み取ります:read.table("file.txt", dec=",", sep=".")

5
MERose

「readr」パッケージの「type_convert」関数を使用できます。 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)
0
cleuton