read.csv到嵌套列表和设置元素名称

时间:2017-11-16 09:26:49

标签: r tidyverse

我正在从几个不同的目录中读取.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#

或者我是以错误的方式解决这个问题?

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

1 个答案:

答案 0 :(得分:2)

根据说明,我们可以使用lapply循环查看文件名&#39;的序列。或使用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循环分配将反映在原始&quot; dat.list&#39;上,而我们必须将lapply分配回dat.list以更新&#39; dat.list&#39;

数据

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))