read.csv 进入嵌套列表并设置元素名称

read.csv into nested list and set element names

我正在将几个不同目录中的 .csv 文件读取到嵌套列表中。按照

filenames <- list(a = list.files("/some_dir_1", pattern = "*.csv"), # not a reproducible example but for demonstration purposes 
                  b = list.files("/some_dir_2", pattern = "*.csv"),
                  c = list.files("/some_dir_3", pattern = "*.csv"))
                  # creates a nested of list of file paths

dat.list <- lapply(filenames, lapply, read.csv)
            # creates a nested list of dataframes, with the same structure as filenames

我想用文件路径命名每个元素。

这可以通过一一命名来完成,例如

    names(dat.list[["a"]]) <- filenames[["a"]]

或者把它放在一个for循环中,但是有没有更通用的方法?最好是 tidyverse 友好的解决方案,按照...

filenames %>% lapply(., lapply, read_csv) %>% #some naming call#

还是我用错了方法?

非常感谢任何帮助,谢谢。

根据描述,我们可以使用 lapply 循环遍历 'filenames' 的序列,或者使用 for 循环来更改每个 names dat.list[[i]] 个元素

lapply(seq_along(filenames), function(i) setNames(dat.list[[i]], filenames[[i]]))

Map

Map(setNames, dat.list, filenames)

for(i in seq_along(filenames)) names(dat.list[[i]]) <- filenames[[i]]

如果我们想使用 tidyverse,基于 base R Map 的等效选项将是

library(purrr)
map2(dat.list, filenames, setNames)

注意:for 循环分配将反映原始 'dat.list',而我们必须将 lapply 分配回 dat.list 以更新 'dat.list'

数据

filenames <- list(a = c('a1.csv', 'a2.csv'), b = c('b1.csv', 'b2.csv'))
set.seed(24)
dat.list <- lapply(1:2, function(i) replicate(2, as.data.frame(matrix(sample(1:5, 5*5, 
        replace = TRUE), 5, 5)), simplify = FALSE))