R语言嵌套列表与循环问题:如何为每个文件生成独立结果列表
解决嵌套列表多文件处理的结果分组问题
你需要的是一个嵌套结构的结果列表:外层每个元素对应files里的一个文件,内层每个元素对应my_list中对应规则的处理结果。下面提供两种可行的实现方式:
方法一:改进双层for循环
通过初始化嵌套空列表,让每个文件的结果存入独立的子列表中:
library(purrr) library(stringr) # 初始化外层空列表,长度和files一致,每个元素是对应文件的结果子列表 my_list_2 <- vector("list", length(files)) # 外层循环遍历每个文件 for(j in seq_along(files)) { current_file <- files[[j]] # 为当前文件初始化内层结果列表,长度和my_list一致 my_list_2[[j]] <- vector("list", length(my_list)) # 内层循环处理my_list的每个规则组 for(i in seq_along(my_list)) { my_list_2[[j]][[i]] <- my_list[[i]] %>% map(function(x) str_extract(current_file, x)) %>% unlist() %>% discard(is.na) } }
方法二:用purrr函数式编程简化代码
如果习惯tidyverse风格,用map嵌套可以替代循环,代码更简洁:
library(purrr) library(stringr) my_list_2 <- map(files, function(current_file) { # 对每个文件,遍历my_list的所有规则组处理 map(my_list, function(patterns) { patterns %>% map(~str_extract(current_file, .x)) %>% unlist() %>% discard(is.na) }) })
额外提示
- 用
seq_along()代替1:length()更安全,当列表为空时不会出现1:0这类无效序列。 - 如果
files有命名,可以给结果列表的外层元素命名,方便区分:names(my_list_2) <- names(files)
内容的提问来源于stack exchange,提问作者MariaK
相关产品推荐
相关产品推荐

