如何在R中将特定结构的List转换为Matrix?
将R列表转换为可变列数矩阵的实现方法
问题背景
我有一个结构如下的R列表,需要按照特定规则转换为矩阵:
示例列表结构
[[1]] [1] "Header A1" [2] "Header A2" [3] "" [4] "Name A1" [5] "Address A1" [6] "Phone A1" [7] "Web A1" [8] "" [9] "Header B1" [10] "Header B2" [11] "" [12] "Address B1" [13] "Address B2" [14] "Phone B1" [15] "Web B1" [16] "" [17] "Header C1" [18] "Header C2" [19] "" [20] "Address C1" [21] "Address C2" [22] "Phone C1" [23] "Web C1" [24] "" [25] "Header D1" [26] "Header D2" [27] "" [28] "Address D1" [29] "Phone D1" [30] "Web D1" [31] "" [32] "Header E1" [33] "Header E2" [34] "" [35] "Address E1" [35] "Address E1" [35] "Address E1" [36] "Phone E1" [37] "Web E1" [38] ""
转换规则
- 空白元素(
"")作为分隔标记 - 以每隔一个空白元素(示例中位置8、16、24、31、38处的空白)作为行分隔符
- 每行元素数量不固定,不足的列用空白填充
期望输出矩阵
| col1 | col2 | col3 | col4 | col5 | col6 | col7 |
|---|---|---|---|---|---|---|
| Header A1 | Header A2 | Name A1 | Address A1 | Phone A1 | Web A1 | |
| Header B1 | Header B2 | Address B1 | Address B2 | Phone B1 | Web B1 | |
| Header C1 | Header C2 | Address C1 | Address C2 | Phone C1 | Web C1 | |
| Header D1 | Header D2 | Address D1 | Phone D1 | Web D1 | ||
| Header E1 | Header E2 | Address E1 | Address E2 | Address E3 | Phone E1 | Web E1 |
可复现输入代码
input_list <- list(c("Header A1", "Header A2", "", "Name A1", "Address A1", "Phone A1", "Web A1", "", "Header B1", "Header B2", "", "Address B1", "Address B2", "Phone B1", "Web B1", "", "Header C1", "Header C2", "", "Address C1", "Address C2", "Phone C1", "Web C1", "", "Header D1", "Header D2", "", "Address D1", "Phone D1", "Web D1", "", "Header E1", "Header E2", "", "Address E1", "Address E2", "Address E3", "Phone E1", "Web E1", ""))
实现方法
以下是程序化的转换步骤,无需额外依赖包:
# 提取列表中的向量 vec <- input_list[[1]] # 按空白元素分割为多个块 blocks <- split(vec, cumsum(vec == "")) # 移除末尾的空块(因输入末尾有空白) blocks <- blocks[-length(blocks)] # 每两个块合并为一行,同时过滤块内的空白元素 rows <- lapply(seq(1, length(blocks), by = 2), function(i) { c(blocks[[i]][blocks[[i]] != ""], blocks[[i+1]][blocks[[i+1]] != "") }) # 获取最长行的列数,作为矩阵的总列数 max_col_count <- max(sapply(rows, length)) # 将所有行填充到统一长度,不足部分补空字符串 padded_rows <- lapply(rows, function(row) { c(row, rep("", max_col_count - length(row))) }) # 转换为矩阵并设置列名 result_matrix <- do.call(rbind, padded_rows) colnames(result_matrix) <- paste0("col", 1:max_col_count) # 查看结果 print(result_matrix)
代码解释
- 提取向量:从输入列表中取出唯一的向量元素
- 分割块:用空白元素将向量拆分为多个块,每个Header块和对应的内容块成对出现
- 合并行:将每一对Header块与内容块合并为一行,同时过滤掉块内的空白元素
- 统一行长度:找到最长行的列数,将所有行填充至该长度,不足位置补空字符串
- 生成矩阵:将填充后的行绑定为矩阵,并设置列名
运行上述代码后,即可得到符合要求的矩阵。
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

