Игнорировать конечные разделители в readr::read_csv

Когда я читаю CSV-файл, содержащий конечный разделитель, используя readr::read_csv, Я получаю предупреждение о том, что имя отсутствующего столбца было заполнено. Вот содержимое короткого примера CSV-файла для воспроизведения этого предупреждения (сохраните следующий фрагмент в файле с именем example.csv):

A,B,C,
2,1,1,
14,22,5,
9,-4,8,
17,9,-3,

Обратите внимание на запятую в конце каждой строки. Теперь, если я загружу этот файл с

read_csv("example.csv")

Я получаю следующее предупреждение:

Missing column names filled in: 'X4'

Даже если я хочу явно загрузить только 3 столбца с

read_csv("example.csv", col_types=cols_only(A=col_integer(),
                                            B=col_integer(),
                                            C=col_integer()))

Я все еще получаю предупреждающее сообщение.

Это ожидаемое поведение или есть какой-то способ сказать read_csv что он должен игнорировать все столбцы, кроме тех, которые я указываю? Или есть другой способ привести в порядок этот (явно искаженный) CSV, чтобы конечные разделители были удалены / проигнорированы?

2 ответа

Решение

Я не думаю, что ты можешь. Из того, что я вижу в документации, cols_only() для R объектов, которые вы уже загрузили.

Тем не менее fread() функция от data.table библиотека позволяет выбирать конкретные имена столбцов при чтении файла в:

DT <- fread("filename.csv", select = c("colA","colB"))

Вот еще один пример с сообщением об ошибке.

> read_csv("1,2,3\n4,5,6", col_names = c("x", "y"))
Warning: 2 parsing failures.
row # A tibble: 2 x 5 col     row   col  expected    actual         file expected   <int> <chr>     <chr>     <chr>        <chr> actual 1     1  <NA> 2 columns 3 columns literal data file 2     2  <NA> 2 columns 3 columns literal data

# A tibble: 2 x 2
      x     y
  <int> <int>
1     1     2
2     4     5

Вот исправление / взлом. Также смотрите эту ссылку SOF. Подавить читательский разбор проблем в r

> suppressWarnings(read_csv("1,2,3\n4,5,6", col_names = c("x", "y")))
# A tibble: 2 x 2
      x     y
  <int> <int>
1     1     2
2     4     5
Другие вопросы по тегам