如何在R语言中导入含方括号的文本数据并转为列表结构
问题描述
我有一个如下所示的文本文件:
[2,4,3,1,5] [6,2,4,3,6] [[3],[1,5,2]] [[4],8] [7] [[8,9,1]]
这些值是以方括号标记的列表,部分为嵌套列表。我希望导入该文本文件后,能保留方括号定义的列表层级结构,得到类似如下的R语言列表输出:
list(c(2,4,3,1,5), c(6,2,4,3,6), list(c(3), c(1,5,2)), list(list(4), 8), list(7), list(list(c(8,9,1)))) #> [[1]] #> [1] 2 4 3 1 5 #> #> [[2]] #> [1] 6 2 4 3 6 #> #> [[3]] #> [[3]][[1]] #> [1] 3 #> #> [[3]][[2]] #> [1] 1 5 2 #> #> #> [[4]] #> [[4]][[1]] #> [[4]][[1]][[1]] #> [1] 4 #> #> #> [[4]][[2]] #> [1] 8 #> #> #> [[5]] #> [[5]][[1]] #> [1] 7 #> #> #> [[6]] #> [[6]][[1]] #> [[6]][[1]][[1]] #> [1] 8 9 1
解决方案
完全可以实现,利用JSON格式兼容这种方括号嵌套结构的特点,用R的jsonlite包就能轻松处理:
具体代码步骤
假设你的文本文件名为lists.txt,执行以下代码:
# 安装并加载jsonlite包(首次使用需安装) # install.packages("jsonlite") library(jsonlite) # 读取文本文件内容 txt_content <- readLines("lists.txt") # 整理成合法JSON数组:过滤空行,用逗号连接每一行,外层套上方括号 json_str <- paste0("[", paste(txt_content[txt_content != ""], collapse = ","), "]") # 解析JSON为R列表,保留嵌套层级 result_list <- fromJSON(json_str, simplifyVector = FALSE) # 查看结果结构 str(result_list)
输出效果
运行后result_list的结构与你期望的完全匹配,打印结构如下:
> str(result_list) List of 6 $ : int [1:5] 2 4 3 1 5 $ : int [1:5] 6 2 4 3 6 $ :List of 2 ..$ : int 3 ..$ : int [1:3] 1 5 2 $ :List of 2 ..$ :List of 1 .. ..$ : int 4 ..$ : int 8 $ :List of 1 ..$ : int 7 $ :List of 1 ..$ :List of 1 .. ..$ : int [1:3] 8 9 1
如果你希望把所有原子向量都额外包裹一层列表(完全对应示例里list(c(...))的形式),可以添加一个递归转换函数:
# 递归函数:将原子向量包裹为列表 wrap_vector <- function(x) { if (is.atomic(x)) { list(x) } else if (is.list(x)) { lapply(x, wrap_vector) } else { x } } # 得到完全匹配示例的结构 final_list <- lapply(result_list, wrap_vector)
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

