我正在从几个不同的目录中读取.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#
或者我是以错误的方式解决这个问题?
非常感谢任何帮助,谢谢。
答案 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))