如何使用readr为类似命名的列定义列规范?

如何使用readr为类似命名的列定义列规范?,r,dplyr,readr,R,Dplyr,Readr,我有一个包含250列的数据库,只想读取其中的50列,而不是加载所有列,然后使用dplyr::select删除列。我想我可以使用列规范来实现这一点。我不想为所有这些列手动键入列规范 我想保留的50列有一个公共前缀,比如“blop”,所以我设法手动更改了从readr::spec\u csv获得的列规范对象。然后我用它来读取我的数据文件: short_colspec <- readr::spec_csv('myfile.csv') short_colspec$cols <- lapply(

我有一个包含250列的数据库,只想读取其中的50列,而不是加载所有列,然后使用dplyr::select删除列。我想我可以使用列规范来实现这一点。我不想为所有这些列手动键入列规范

我想保留的50列有一个公共前缀,比如“blop”,所以我设法手动更改了从readr::spec\u 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或任何其他包函数来指定这样的列规范,这种方法比我所做的更健壮?

使用数据。表的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 )
使用readr,看起来您是如何做到这一点的。与substr相反,grepl可能会对其进行改进,从而使其更加灵活。此外,您的代码假定您正在读取的列都是列字符,grepl提供了更大的灵活性!为了简单起见,我只假设了字符串变量,可以扩展if-else语法以考虑更多的列类型。