R语言导入PDF文件并完成数据整理的实操问题咨询
PDF导入优化方案
针对带表格的PDF数据,推荐两种比read_table更稳妥的导入方式,可避免单变量、丢单元格内容的问题:
- 方案1:用
pdftools::pdf_data()按坐标提取
该函数会返回带位置坐标的文本结果,可精准筛选你需要的底部117行区域,自动对齐列:
library(pdftools) library(tidyverse) # 读取PDF所有页面文本及坐标 pdf_raw <- pdf_data("Q2 - WPA_points (Field).pdf") # 单页PDF取第一个列表元素,多页可通过bind_rows合并 page_df <- pdf_raw[[1]] # 筛选排除前5行的y坐标范围(可先运行View(page_df)查看前5行对应的y区间,替换下方参数) table_df <- page_df %>% filter(y > 120) %>% # 120为示例值,根据实际调整 arrange(y, x) %>% group_by(y) %>% mutate(col_id = row_number()) %>% ungroup() %>% pivot_wider(id_cols = y, names_from = col_id, values_from = text)
- 方案2:用
tabulizer包自动识别表格
该包专门用于PDF表格提取,可自动识别结构直接导出规整数据框,适合无复杂格式的PDF表格:
# 安装命令:remotes::install_github("ropensci/tabulizer"),使用前需安装Java8及以上版本 library(tabulizer) # 可通过area参数指定提取区域,跳过头部无关内容 field_data <- extract_tables("Q2 - WPA_points (Field).pdf", output = "data.frame")[[1]]
现有数据的需求实现代码
针对你已经删除前5行的数据集,以下代码可一次性完成三个需求:
library(tidyverse) # 1. 将第一行设为列名 col_names <- as.character(field_data[1,]) field_data <- field_data[-1,] colnames(field_data) <- col_names # 统一转为字符型避免类型报错 field_data <- mutate(field_data, across(everything(), as.character)) # 2. Event为空的行右移对齐 + 3. 填充Event空值 # 以下代码默认你有7列,列名为Event、Class、a、b、c、d、e,可根据实际列名调整 field_data_clean <- field_data %>% rowwise() %>% mutate( # 标记Event为空的行 empty_event = is.na(Event) | str_squish(Event) == "", # 右移对齐逻辑:空行的所有列依次向左取上一列的内容,Event位留空后续填充 new_Event = ifelse(empty_event, NA_character_, Event), new_Class = ifelse(empty_event, Event, Class), new_a = ifelse(empty_event, Class, a), new_b = ifelse(empty_event, a, b), new_c = ifelse(empty_event, b, c), new_d = ifelse(empty_event, c, d), new_e = ifelse(empty_event, d, e) ) %>% ungroup() %>% # 保留处理后的列并重命名 select(Event = new_Event, Class = new_Class, a = new_a, b = new_b, c = new_c, d = new_d, e = new_e) %>% # 向下填充Event列的空值 fill(Event, .direction = "down")
内容的提问来源于stack exchange,提问作者Gary Chen
相关产品推荐
相关产品推荐

