Как пропустить чтение некоторых столбцов в readr

У меня есть простой файл csv, называемый "test.csv" со следующим содержимым:

colA,colB,colC
1,"x",12
2,"y",34
3,"z",56

Скажем, я хочу пропустить чтение в colA и просто прочитать в colB и colC. Мне нужен общий способ сделать это, потому что у меня много файлов для чтения, а иногда colA называется вообще чем-то другим, но colB и colC всегда одинаковы.

Согласно документации read_csv, один из способов добиться этого - передать именованный список для col_types и только назвать столбцы, которые вы хотите сохранить:

read_csv('test.csv', col_types = list(colB = col_character(), colC = col_numeric()))

Не упоминая colA, он должен быть сброшен с выхода. Однако результирующий кадр данных:

Source: local data frame [3 x 3]

      colA colB colC
    1    1    x   12
    2    2    y   34
    3    3    z   56

Я делаю что-то неправильно или документация read_csv не верна? Согласно файлу справки:

Если список, он должен содержать один "коллекционер" для каждого столбца. если ты только хотите прочитать подмножество столбцов, вы можете использовать именованный список (где имена дают имена столбцов). Если колонка не указана по имени он не будет включен в выход.

Ответ 1

Есть ответ, я просто не искал достаточно сложно: https://github.com/hadley/readr/issues/132

По-видимому, это была проблема с документацией, которая была исправлена. Эта функциональность может в конечном итоге быть добавлена, но Хэдли подумал, что было бы более полезно иметь возможность просто обновлять один тип столбца, а не бросать другие.

Ответ 2

"Согласно документации read_csv, один из способов сделать это - передать именованный список для col_types и назвать только те столбцы, которые вы хотите сохранить"

WRONG: read_csv('test.csv', col_types=list(colB='c', colC='c'))

Нет, документ вводит в заблуждение, вы должны либо указать, что безымянные col_skip() class= '_'/col_skip()), либо явно указать их класс как NULL:

read_csv('test.csv', col_types=list('*'='_', colB='c', colC='c'))

read_csv('test.csv', col_types=list('colA'='_', colB='c', colC='c'))