R читать набор данных, который имеет неравный столбец

У меня есть набор данных .csv, разделенный символом , и содержащий около 5000 строк и 5 столбцов.

Однако для некоторых столбцов содержимое также содержит , например:

2660,11-01-2016,70.75,05-06-2013,I,,,

4080,26-02-2016,59.36,,D

Таким образом, когда я попытался прочитать его с помощью read_delim(), он выдаст мне warnings, но результат должен быть в порядке, например:

Предупреждение: 7 ошибок парсинга.

row # Таблица: 5 x 5 col row col ожидаемый фактический файл ожидаемый фактический 1 309 5 столбцов 8 столбцов 'data/my_data.csv' файл 2 523 5 столбцов 7 столбцов 'data/my_data.csv' строка 3 588 5 столбцов 8 столбцов 'data/my_data.csv' col 4 1661 5 столбцов 9 столбцов 'data/my_data.csv' ожидается 5 1877 5 столбцов 7 столбцов 'data/my_data.csv'

Есть ли способ для меня решить эту проблему?

Думаю, я мог бы использовать read_Lines() и обработать их один за другим, а затем превратить их в фрейм данных.

Есть ли у вас другие способы справиться с такой ситуацией?


person rz.He    schedule 24.11.2017    source источник
comment
Если вашим разделителем является запятая, но в ваших данных есть необработанные, неэкранированные запятые, то read.table никак не может различать. Вы можете либо избегать столбцов с данными запятой, либо, как вы предлагаете, читать каждую строку вручную.   -  person Tim Biegeleisen    schedule 24.11.2017


Ответы (1)


1) read.table с fill=TRUE Использование fill=TRUE с read.table не приводит к предупреждениям:

Lines <- "2660,11-01-2016,70.75,05-06-2013,I,,,
4080,26-02-2016,59.36,,D"

# replace text = Lines with your filename    
read.table(text = Lines, sep = ",", fill = TRUE)

давая:

    V1         V2    V3         V4 V5 V6 V7 V8
1 2660 11-01-2016 70.75 05-06-2013  I NA NA NA
2 4080 26-02-2016 59.36             D NA NA NA

2) заменить первые 4 запятые точкой с запятой Другой подход:

# replace textConnection(Lines) with your filename
L <- readLines(textConnection(Lines))
for(i in 1:4) L <- sub(",", ";", L)
read.table(text = L, sep = ";")

давая:

    V1         V2    V3         V4   V5
1 2660 11-01-2016 70.75 05-06-2013 I,,,
2 4080 26-02-2016 59.36               D

3) удалить запятые в конце строк Другой вариант — удалить запятые в конце строк. (Если вы работаете в Windows, то sed находится в дистрибутиве Rtools.)

read.table(pipe("sed -e s/,*$// readtest.csv"), sep = ",")

давая:

    V1         V2    V3         V4 V5
1 2660 11-01-2016 70.75 05-06-2013  I
2 4080 26-02-2016 59.36             D

3a) аналогично (3), но без sed

# replace textConnection(Lines) with your filename
L <- readLines(textConnection(Lines))
read.table(text = sub(",*$", "", L), sep = ",")
person G. Grothendieck    schedule 24.11.2017