R 2.13.1 в Mac OS X. Я пытаюсь импортировать файл данных, имеющий точку для разделителя тысяч и запятую в качестве десятичной точки, а также конечный минус для отрицательных значений.
По сути, я пытаюсь конвертировать из:
"A|324,80|1.324,80|35,80-"
в
V1 V2 V3 V4
1 A 324.80 1324.8 -35.80
Теперь в интерактивном режиме выполняются обе следующие работы:
gsub("\\.","","1.324,80")
[1] "1324,80"
gsub("(.+)-$","-\\1", "35,80-")
[1] "-35,80"
, а также их объединение:
gsub("\\.", "", gsub("(.+)-$","-\\1","1.324,80-"))
[1] "-1324,80"
Однако я не могу удалить разделитель тысяч из read.data:
setClass("num.with.commas")
setAs("character", "num.with.commas", function(from) as.numeric(gsub("\\.", "", sub("(.+)-$","-\\1",from))) )
mydata <- "A|324,80|1.324,80|35,80-"
mytable <- read.table(textConnection(mydata), header=FALSE, quote="", comment.char="", sep="|", dec=",", skip=0, fill=FALSE,strip.white=TRUE, colClasses=c("character","num.with.commas", "num.with.commas", "num.with.commas"))
Warning messages:
1: In asMethod(object) : NAs introduced by coercion
2: In asMethod(object) : NAs introduced by coercion
3: In asMethod(object) : NAs introduced by coercion
mytable
V1 V2 V3 V4
1 A NA NA NA
Обратите внимание, что если я изменю с "\\."в функции "," все выглядит немного иначе:
setAs("character", "num.with.commas", function(from) as.numeric(gsub(",", "", sub("(.+)-$","-\\1",from))) )
mytable <- read.table(textConnection(mydata), header=FALSE, quote="", comment.char="", sep="|", dec=",", skip=0, fill=FALSE,strip.white=TRUE, colClasses=c("character","num.with.commas", "num.with.commas", "num.with.commas"))
mytable
V1 V2 V3 V4
1 A 32480 1.3248 -3580
Я думаю, что проблема в том, что read.data с dec = "," преобразует входящие "," в "."ДО вызова as (from, "num.with.commas"), так что входная строка может быть, например, "1.324.80".
Я хочу как ("1.123,80 -", "num.with.commas ") для возврата -1123.80 и as (" 1.100.123,80 "," num.with.commas ") для возврата 1100123.80.
Как сделать так, чтобы мои num.with.commas заменяли все кроме последней десятичной точки во входной строке?
Обновление : во-первых, я добавил отрицательный прогноз и получил as (), работающий в консоли:
setAs("character", "num.with.commas", function(from) as.numeric(gsub("(?!\\.\\d\\d$)\\.", "", gsub("(.+)-$","-\\1",from), perl=TRUE)) )
as("1.210.123.80-","num.with.commas")
[1] -1210124
as("10.123.80-","num.with.commas")
[1] -10123.8
as("10.123.80","num.with.commas")
[1] 10123.8
Тем не менее, read.table все еще имел ту же проблему.Добавление некоторых функций print () к моей функции показало, что num.with.commas фактически получает запятую, а не точку.
Поэтому мое текущее решение состоит в том, чтобы затем заменить с "," на "."в num.with.commas.
setAs("character", "num.with.commas", function(from) as.numeric(gsub(",","\\.",gsub("(?!\\.\\d\\d$)\\.", "", gsub("(.+)-$","-\\1",from), perl=TRUE))) )
mytable <- read.table(textConnection(mydata), header=FALSE, quote="", comment.char="", sep="|", dec=",", skip=0, fill=FALSE,strip.white=TRUE, colClasses=c("character","num.with.commas", "num.with.commas", "num.with.commas"))
mytable
V1 V2 V3 V4
1 A 324.8 1101325 -35.8