Импорт данных CSV, содержащих запятые, разделители тысяч и конечный знак минус - PullRequest
4 голосов
/ 19 июля 2011

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

Ответы [ 2 ]

4 голосов
/ 19 июля 2011

Сначала вы должны удалить все точки, а затем заменить запятые на десятичные точки, прежде чем использовать as.numeric ().Позже вы можете контролировать, как десятичные точки печатаются с помощью параметров (OutDec = ",").Я не думаю, что R использует запятые в качестве десятичных разделителей внутри, даже в местах, где они являются обычными.

1 голос
/ 19 июля 2011

Вот решение с регулярными выражениями и подстановками

mydata <- "A|324,80|1.324,80|35,80-"
# Split data
mydata2 <- strsplit(mydata,"|",fixed=TRUE)[[1]]
# Remove commas
mydata3 <- gsub(",","",mydata2,fixed=TRUE)
# Move negatives to front of string
mydata4 <- gsub("^(.+)-$","-\\1",mydata3)
# Convert to numeric
mydata.cleaned <- c(mydata4[1],as.numeric(mydata4[2:4]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...