Как определить спецификацию столбца для столбца с аналогичным именем с помощью readr?

У меня есть база данных с 250 столбцами, и я хочу прочитать только 50 из них вместо того, чтобы загружать их все, а затем удалять столбцы с dplyr::select. Я полагаю, что могу сделать это, используя спецификацию столбца. Я не хочу вводить спецификацию столбца вручную для всех этих столбцов.

50 столбцов, которые я хочу сохранить, имеют общий префикс, скажем, «blop», поэтому мне удалось вручную изменить объект спецификации столбца, который я получил от readr::spec_csv. Затем я использовал его для чтения моего файла данных:

short_colspec <- readr::spec_csv('myfile.csv')
short_colspec$cols <- lapply(names(short_colspec$cols), function(name){
    if (substr(name, 1, 4) == 'blop'){
        return(col_character())
    } else {
        return(col_skip())
    }
})
short_data <- read_csv('myfile.csv', col_types = short_colspec)

Есть ли способ указать такую ​​спецификацию столбца с функциями readr (или любого другого пакета) более надежным способом, чем то, что я сделал?


person Romain    schedule 04.09.2018    source источник
comment
Использование readr похоже на то, как вы это сделали, это подход. Потенциально его можно было бы улучшить с помощью grepl, а не substr, чтобы сделать его более гибким. Также ваш код предполагает, что все столбцы, которые вы читаете, являются col_character   -  person Chris    schedule 04.09.2018
comment
Действительно grepl обеспечивает большую гибкость! Для простоты я предположил только строковые переменные, это правда, что синтаксис if else можно расширить, чтобы учесть больше типов столбцов.   -  person Romain    schedule 05.09.2018


Ответы (1)


используя data.table fread, вы можете выбрать столбцы, которые хотите пропустить (=удалить) или сохранить (=выбрать)

#read first line of file to select which columns to keep
#adjust the strsplit-character here ';' according to your csv-type
keep_col <- readLines( "myfile.csv", n = 1L ) %>% strsplit( ";" ) %>% el() %>% grep( "blop", . )
#read file, only the desired columns
fread( "myfile.csv", select = keep_col )
person Wimpel    schedule 04.09.2018