Как загрузить 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)