金魚亭日常

読書,ガジェット,競技プログラミング

readr::read_csv() の列数を動的に変える

cols()[] で切り出せないらしい

dirname <- "data"
d <- dir(dirname) %>% 
    map_dfr(function(x){
               # 先頭行を見て列数を判定する
               ncol <- readLines(file.path(dirname, x), n=1) %>% 
                       str_split(",") %>% 
                       .[[1]] %>% length()
               col_names <- c("V1", "V2", "V3", "V4", "V5")
               col_names <- col_names[1:ncol]
               # expr()[1] は cols() なので ncol + 1 まで
               # col_integer() とかだとこれでは無理なので "i" とかでやる 
               col_types <- eval(expr(cols("i", "c", "c", "i", "c"))[1:(ncol + 1)])
               d <- read_csv(file.path(dirname, x), 
                             col_names = col_names, 
                             col_types = col_types)
               d
           }
           )
head(d)