如何使用R抓取格式相似的TXT选举结果数据并构建可合并的数据框
实现方案
你可以通过R的tidyverse生态工具完成需求,具体步骤和示例代码如下:
核心处理思路
- 先跳过TXT开头的无效标题行,提取乡镇、选举日期等元数据
- 合并多行复合表头,将候选人姓名+党派拼接为单个列名
- 用固定宽度读取工具解析规整的选票数值
- 封装为批量处理函数,一次性读取所有同类文件后合并为总数据集
示例代码
# 加载依赖包 library(tidyverse) # 单个文件处理函数 process_election_txt <- function(file_path) { # 读取所有文本行 all_lines <- readLines(file_path, encoding = "UTF-8") # 提取元数据 township <- str_squish(all_lines[1]) election_date <- str_extract(all_lines[2], "\\w+ \\d{1,2}, \\d{4}") # 过滤出有效数据行,跳过空行 data_lines <- all_lines[14:length(all_lines)] %>% str_squish() %>% .[. != ""] # 自定义合并后的列名(如果同类文件表头固定,一次定义可复用) col_names <- c( "district", "peter_c_bylone_sr_democratic", "richard_harlan_democratic", "mary_ann_micheletti_levari_republican", "henry_l_coia_jr_republican", "total_machine_count", "total_vote_by_mail", "total_provisional_count", "total_emergency_count", "total_public_count" ) # 读取固定宽度格式的数值 df <- read_fwf( I(data_lines), fwf_empty(I(data_lines), col_names = col_names), na = c("", " ") ) # 补充元数据方便后续区分不同文件 df <- df %>% mutate( township = township, election_date = as.Date(election_date, format = "%B %d, %Y"), source_file = basename(file_path) ) return(df) } # 批量处理所有同格式TXT # 替换为你存放TXT文件的文件夹路径 all_txt_files <- list.files("your_txt_folder", pattern = "\\.txt$", full.names = TRUE) full_dataset <- map_dfr(all_txt_files, process_election_txt)
适配性优化建议
- 如果不同文件的候选人名单不固定,可以写逻辑自动提取表头行的姓名、党派内容拼接为列名,无需手动定义
- 如果自动识别列宽不准,可以手动指定
fwf_cols的列起止位置,解析稳定性更高 - 如需适配更多选举类型文件,可以将数据转为长格式,把候选人+党派作为单独字段存储,避免列名不一致导致合并失败
内容的提问来源于stack exchange,提问作者Cody_15243
相关产品推荐
相关产品推荐

