2014-10-02 3 views
0

У меня есть. CSV-файл для импорта в R, который имеет более 1K наблюдений. Однако, когда я использовал функцию read.csv, как обычно, импортированный файл имеет только 21 наблюдение. Это странно. Я никогда не видел этого раньше.Потеря данных во время чтения.csv в R

t <- read.csv("E:\\AH1_09182014.CSV",header=T, colClasses=c(rep("character",3),rep("numeric",22)),na.string=c("null","NaN",""),stringsAsFactors=FALSE) 

Может ли кто-нибудь помочь мне разобраться в проблеме? Я даю ссылку на мой файл данных:

https://drive.google.com/file/d/0B86_a8ltyoL3TzBza0x1VTd2OTQ/edit?usp=sharing

+1

Посмотрите на строку 22 - есть ли что-нибудь странное? – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Кажется, в строке 22 есть беспорядочное значение ... Не может ли R просто принудить это к значению NA? – Vicki1227

+0

Похоже, что в файле много других строк, которые также вызовут проблемы. Вы можете использовать 'fread' в пакете' data.table' для чтения во всем файле. Все столбцы будут принуждаться к символу из-за нечисловых значений, разбросанных по столбцам с 4 по 25, но у вас будет как минимум весь файл, и вы можете просто вручную очистить его соответственно оттуда. – nrussell

ответ

2

У вас есть какие-то беспорядочные символы в данных - такие вещи, как встроенные управляющие символы.

Обойти это можно прочитать файл в двоичном режиме, а также использовать read.csv на текстовый файл для чтения в.

This answer proposes a basic function сделать эти шаги.

Функция выглядит следующим образом:

sReadLines <- function(fnam) { 
    f <- file(fnam, "rb") 
    res <- readLines(f) 
    close(f) 
    res 
} 

Вы можете использовать его следующим образом:

temp <- read.csv(text = sReadLines("~/Downloads/AH1_09182014.CSV"), 
       stringsAsFactors = FALSE) 

ли все линии были считаны?

dim(temp) 
# [1] 1449 25 

Где эта проблема?

unlist(temp[21, ], use.names = FALSE) 
# [1] "A-H Log 1" "09/18/2014" "0:19:00" "7.866"  "255"  "0.009" 
# [7] "525"  "7"   "4468"  "76"   "4576.76" "20"  
# [13] "71"   "19"   "77"   "1222"  "33857"  "-3382" 
# [19] "26\032)" "18.30"  "84.80"  "991.43"  "23713.90" "0.85" 
# [25] "10.54" 

^^ см. Пункт [19] выше.

Из-за этого вы не сможете указать все свои типы столбцов спереди - если вы не очистите CSV первым.

+0

Спасибо Ананда. Почему мой dim (temp) возвращает матрицу 512 * 24, отличную от 1449? Я просто скопировал ваш код ... – Vicki1227

+0

@ Vicki1227, боюсь, я не могу больше помочь. Я просто загрузил ваш CSV и применил к нему эту идею и получил описанный выше объект. Очистите рабочее пространство и запустите его заново? – A5C1D2H2I1M1N2O1R2T1