如何展平含异构子列表的列表?R语言实现优化方案探讨
优化方案:从init_list直接生成desired_list
你可以通过简化流程,利用purrr的内置函数直接完成转换,无需额外自定义两个辅助函数,代码更简洁高效:
library(purrr) vec <- c("A"=1,"B"=2, "A"=1, "B"=4) vec2 <- c("A2"=1,"B2"=2, "A2"=3, "B2"=4) init_list <- list(vec=vec, C=1, vec2=vec2) # 一步生成目标列表 desired_list <- init_list %>% imap(function(x, elem_name) { if (length(x) > 1) { # 按向量的名字分组,去重后拼接成字符串 split(x, names(x)) %>% map(~paste(unique(.), collapse = ", ")) } else { # 单元素项直接保留原命名 set_names(list(x), elem_name) } }) %>% flatten() # 输出结果 desired_list # $A # [1] "1" # $B # [1] "2, 4" # $A2 # [1] "1, 3" # $B2 # [1] "2, 4" # $C # [1] 1
优化点说明:
- 用
imap同时遍历列表的元素和名字,无需单独处理命名逻辑 - 对长向量直接用
split按名字分组,替代原cluster_by_name的循环逻辑 - 最后用
flatten一键扁平化嵌套列表,替代原flatten_sublist的循环拼接操作 - 全程逻辑连贯,从原始列表直接生成目标结构,减少中间变量
如果偏好base R实现,也可以用以下代码,无需加载purrr包:
vec <- c("A"=1,"B"=2, "A"=1, "B"=4) vec2 <- c("A2"=1,"B2"=2, "A2"=3, "B2"=4) init_list <- list(vec=vec, C=1, vec2=vec2) process_item <- function(x, item_name) { if (length(x) > 1) { tapply(x, names(x), function(v) paste(unique(v), collapse = ", ")) } else { structure(list(x), names = item_name) } } desired_list_base <- unlist(lapply(names(init_list), function(n) process_item(init_list[[n]], n)), recursive = FALSE)
内容的提问来源于stack exchange,提问作者Ferroao
相关产品推荐
相关产品推荐

