如何在R中读取含方括号的文件并转为带列表元素的数据框?
解决R中读取含列表格式CSV文件的问题
错误原因
你的CSV文件中,[G30, F00]这类字段内部包含逗号,而read.csv默认会把所有逗号识别为列分隔符,导致实际拆分出的列数超过表头定义的5列,因此抛出more columns than column names错误。
解决方案
方法一:Base R 手动处理
- 先读取所有行内容
lines <- readLines("example.txt")
- 用正则表达式分割每行,仅拆分不在方括号[]内的逗号
split_lines <- strsplit(lines, "(?<!\\[[^\\]]*),(?![^\\[]*\\])", perl = TRUE)
- 转换为数据框并设置表头
df <- as.data.frame(do.call(rbind, split_lines), stringsAsFactors = FALSE) colnames(df) <- df[1, ] df <- df[-1, ]
- 将含列表的列转换为列表格式(每个元素为字符向量)
# 定义处理函数:去除首尾方括号,拆分内部内容为向量 process_list_col <- function(x) { x_clean <- gsub("^\\[|\\]$", "", x) strsplit(x_clean, ",\\s*") } # 应用到目标列 df$ICD10_2023 <- process_list_col(df$ICD10_2023) df$ICD10_2019 <- process_list_col(df$ICD10_2019) df$ubk_coding_19 <- process_list_col(df$ubk_coding_19)
方法二:使用data.table(更简便)
data.table的fread函数能智能识别字段内部的逗号,自动正确拆分列:
- 安装并加载data.table(若未安装)
install.packages("data.table") library(data.table)
- 读取文件
dt <- fread("example.txt", sep = ",", quote = "")
- 转换列表列
process_list_col <- function(x) { x_clean <- gsub("^\\[|\\]$", "", x) strsplit(x_clean, ",\\s*") } # 批量处理目标列 dt[, c("ICD10_2023", "ICD10_2019", "ubk_coding_19") := lapply(.SD, process_list_col), .SDcols = c("ICD10_2023", "ICD10_2019", "ubk_coding_19")]
处理完成后,df或dt中的目标列每个元素都是字符向量,例如df$ICD10_2023[[1]]会返回c("G30", "F00")。
内容的提问来源于stack exchange,提问作者Caterina
相关产品推荐
相关产品推荐

