R语言PDF解析后文本无法拆分为列的问题解决
PDF文本拆分数据框列的问题解决
问题背景
已将PDF转为文本,提取到目标行"TRIGLYCERIDES SERUM 115.3 Normal : Upto 150 Border Line mg/dl",通过strsplit(" +")拆分后得到三部分内容,但转成数据框时遇到两个问题:
- 使用
read.csv得到0行结果 - 使用
separate_wider_delim报错
解决方法1:修复read.csv返回0行的问题
问题原因
read.csv默认将第一行识别为表头,而我们的字符串是唯一的数据行,导致被误判为表头,没有数据行返回。
修正代码
pdf_rowwise[[4]][6: length(pdf_rowwise[[4]])] |> strsplit(" +") |> Filter(f = \(x) length(x) == 3) |> lapply(paste, collapse = "|") |> do.call(what = "c") |> read.csv(text = _, check.names = FALSE, sep = "|", header = FALSE, col.names = c("Test Name", "Result", "Unit"))
关键修改
- 添加
header = FALSE:告诉read.csv第一行是数据而非表头 - 指定
col.names:设置数据框的列名
解决方法2:修复separate_wider_delim的报错问题
问题原因
separate_wider_delim必须明确指定要拆分的列,原代码未提供cols参数导致报错。
修正代码(显式列名)
pdf_rowwise[[4]][6: length(pdf_rowwise[[4]])] %>% strsplit(" +") %>% Filter(f = \(x) length(x) == 3) %>% lapply(paste, collapse = "|") %>% do.call(what = "c") %>% data.frame(Test_String = .) %>% # 给单列命名,便于指定拆分目标 separate_wider_delim(cols = Test_String, delim = "|", names = c("Test Name","Result","Unit"))
简化写法(自动识别单列)
pdf_rowwise[[4]][6: length(pdf_rowwise[[4]])] %>% strsplit(" +") %>% Filter(f = \(x) length(x) == 3) %>% lapply(paste, collapse = "|") %>% do.call(what = "c") %>% data.frame() %>% separate_wider_delim(cols = everything(), delim = "|", names = c("Test Name","Result","Unit"))
关键修改
- 添加
cols参数:指定要拆分的列(everything()选中所有列,这里即唯一的一列)
更简洁的替代方案
跳过拼接为|分隔字符串的步骤,直接将拆分后的列表转为数据框:
pdf_rowwise[[4]][6: length(pdf_rowwise[[4]])] %>% strsplit(" +") %>% Filter(f = \(x) length(x) == 3) %>% do.call(rbind, .) %>% as.data.frame(stringsAsFactors = FALSE) %>% setNames(c("Test Name", "Result", "Unit"))
说明
do.call(rbind, .)将列表转为矩阵,直接适配数据框结构setNames直接设置列名,步骤更高效
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

