Search code examples
rnested

naming nested lists with lapply and substr, in a simpler way


This is my folder structure

enter image description here

Inside each folder are multiple csv files:

enter image description here

I want to make lists like below (I have typed in manually, without using lists)

enter image description here

So I tried this code:

data_dir <- "C:/Users/thepr/Documents/data/as"
num_fu <- 1 : 9
dirs <- paste0(data_dir, num_fu)

flnames <- lapply(dirs, list.files, pattern = "\\.csv$", full.names = TRUE)
as_list <- lapply(flnames, lapply, read.csv)
names(as_list) <- lapply(flnames, lapply, function(x) str_sub(sub("\\.csv$", "", basename(x)), 1, 6))

But it returns:

> names(as_list)[[1]]
[1] "list(\"as1_01\", \"as1_02\", \"as1_03\", \"as1_04\", \"as1_06\", \"as1_07\", \"as1_08\", \"as1_09\", \"as1_10\", \"as1_17\", \"as1_18\", \"as1_19\")"
> names(as_list)[[2]]
[1] "list(\"as2_01\", \"as2_02\", \"as2_03\", \"as2_04\", \"as2_07\", \"as2_08\", \"as2_09\", \"as2_10\", \"as2_19\", \"as2_20\")"
> names(as_list)[[1]][[1]]
[1] "list(\"as1_01\", \"as1_02\", \"as1_03\", \"as1_04\", \"as1_06\", \"as1_07\", \"as1_08\", \"as1_09\", \"as1_10\", \"as1_17\", \"as1_18\", \"as1_19\")"

I want

>names(as_list)[[1]]
as1_01 as1_02 as1_03 as1_04 as1_05 ...
>names(as_list)[[1]][[1]]
as1_01
>names(as_list)[[1]][[2]]
as1_02
>names(as_list)[[1]][[3]]
as1_03

I have looked at other questions here, but not much help so far... Thank you!


Solution

  • Maybe something like :

    as_list <- lapply(dirs, function(x) {
      files <- list.files(x, pattern = "\\.csv$", full.names = TRUE)
      names(files) <- str_sub(basename(files), 1, 6)
      lapply(files, read.csv)
    })