R语言如何展平嵌套列表并生成结构正确的二维数值矩阵
问题原因
process_list函数的返回值类型不统一:输入值为1时返回嵌套列表,输入值为2时返回原子数值向量,导致lapply输出的processed_list是层级不一致的混合结构,直接调用rbind会按顶层元素逐行绑定,最终得到结构异常的结果。
方法1:展平为指定的单层列表
无需加载第三方包,直接通过递归判断元素类型展平即可,代码如下:
# 定义单层展平函数,保留每个长度为2的数值向量作为独立列表元素 flatten_list <- function(x) { unlist( lapply(x, function(elem) { if (is.list(elem)) flatten_list(elem) else list(elem) }), recursive = FALSE ) } # 得到目标单层列表 flat_processed <- flatten_list(processed_list)
运行后flat_processed结构如下,完全符合预期:
[[1]] [1] 1 1 [[2]] [1] 2 2 [[3]] [1] 3 3
方法2:生成标准3行2列数值矩阵
有两种实现路径,按需选择即可:
- 路径1:从根源统一函数返回值类型(最稳妥,后续不会出现类型不一致问题)
修改process_list让所有分支返回可直接按行绑定的矩阵结构,后续直接调用rbind即可:
process_list <- function(item) { if(item == 1) { return(rbind(c(1, 1), c(2, 2))) } else { return(matrix(c(3, 3), nrow = 1)) } } processed_list <- lapply(raw_list, process_list) mat <- do.call(rbind, processed_list)
- 路径2:不修改原处理逻辑,先展平再绑定
如果不想调整原有函数,先把processed_list展平为单层列表,再按行绑定即可:
flat_processed <- unlist( lapply(processed_list, function(elem) if(is.list(elem)) elem else list(elem)), recursive = FALSE ) mat <- do.call(rbind, flat_processed)
两种路径得到的mat结构完全一致:
[,1] [,2] [1,] 1 1 [2,] 2 2 [3,] 3 3
内容的提问来源于stack exchange,提问作者Raniere Silva
相关产品推荐
相关产品推荐

