Как загрузить df с разделителем 1000 в R как числовой класс?

У меня есть файл UTF-16 Unicode Text (.txt), загруженный и установленный по умолчанию в виде значений через запятую (.csv) при сохранении на диске Mac. Этот файл содержит числовые данные, к которым применен разделитель 1000 для чисел, превышающих 1000. При загрузке в R эти данные находятся в символьном классе. Чтобы преобразовать в числовой класс, я делаю следующее:

tx <- read.table("/Users/username/Desktop/report.csv",sep="\t", dec = ".", fileEncoding = "UTF-16LE", fill = T, skip=1 , quote="", header=T, stringsAsFactors = FALSE)

tx$Cost <- gsub("\\,", replacement = "", x = tx$Cost)

tx$Cost <- as.numeric(tx$Cost)
Warning message:
NAs introduced by coercion 

При суммировании с использованием функции head(subset()) следующий результат - то, что я все еще не могу преобразовать в числовой класс:

       **Orig after_gsub as.numeric**
1      95.31      95.31      95.31
2     992.77     992.77     992.77
3 "1,719.68"  "1719.68"         NA
4 "3,135.79"  "3135.79"         NA
5     111.91     111.91     111.91
6     305.12     305.12     305.12

Может кто-нибудь помочь мне преобразовать их в числовой класс, используя as.numeric()?

3 ответа

Работающий пример, использующий setClass, setAs а также colClasses:

 library(methods)
  setClass("chr.w.commas", contains=numeric())
  setAs("character", "chr.w.commas", function(from) 
                              as.numeric(gsub("\\,", "",from )) )
 dat <- read.table(text="Orig after_gsub num
 1      '95.31'      '95.31'      '95.31'
 2     992.77     992.77     992.77
 3 '1,719.68'  '1719.68' NA
 4 '3,135.79'  '3135.79' NA
 5     111.91 111.91 111.91
 6     305.12     305.12     305.12", header=TRUE, colClasses="chr.w.commas")
 str(dat)
'data.frame':   6 obs. of  3 variables:
 $ Orig      : num  95.3 992.8 1719.7 3135.8 111.9 ...
 $ after_gsub: num  95.3 992.8 1719.7 3135.8 111.9 ...
 $ num       : num  95.3 992.8 NA NA 111.9 ...

Спасибо всем, кто здесь помог. Я действительно обнаружил, что моя функция загрузки была проблемой, и следующий код выполняет простой трюк для правильного считывания данных с самого начала.

read.csv(filename, sep="\t", fileEncoding="UTF-16", skip=1)    

Я подозреваю, что gsub не работает правильно на ваших строках UTF-16. Возможно, вам следует преобразовать строки перед выполнением замены. Попробуйте следующее:

tx <- read.table("/Users/username/Desktop/report.csv",sep="\t", dec = ".", fileEncoding = "UTF-16LE", fill = T, skip=1 , quote="", header=T, stringsAsFactors = FALSE)
tx$Cost <- iconv(tx$Cost,"UTF-16","ASCII",sub='')
tx$Cost <- gsub("\\,", replacement = "", x = tx$Cost)
tx$Cost <- as.numeric(tx$Cost)
Другие вопросы по тегам