如何在R中重构特殊结构的近代中国报业数据集以用于GIS可视化
需求实现方案
完全可以在R中实现该批量处理需求,具体实现步骤如下:
步骤1:安装加载所需依赖包
需用到Excel读取、数据清洗、多语言编码处理相关工具包,执行以下代码加载:
# 安装依赖(仅首次执行) install.packages(c("readxl", "tidyverse", "stringi")) # 加载包 library(readxl) library(tidyverse) library(stringi) # 全局设置编码为UTF-8,避免多语言乱码 Sys.setlocale("LC_ALL", "UTF-8")
步骤2:定义单Sheet数据处理函数
核心逻辑是对单个地点的Sheet完成块识别、长宽转换,代码示例:
process_single_sheet <- function(file_path, sheet_name) { # 读取Sheet数据,不自动识别表头 raw_data <- read_excel(file_path, sheet = sheet_name, col_names = FALSE, .name_repair = "minimal") # 提取年份作为列名 year_cols <- str_remove(as.character(raw_data[1, ]), "年") colnames(raw_data) <- c("attr_name", year_cols[-1]) # 去掉第一行表头行、全空行 raw_data <- raw_data[-1, ] %>% filter(if_any(everything(), ~!is.na(.))) # 给每个报纸块打分组ID:每遇到报纸标题行则分组ID+1 raw_data <- raw_data %>% mutate(newspaper_id = cumsum(str_detect(attr_name, "Title of Newspaper"))) # 长格式转换+按年份展开 processed <- raw_data %>% pivot_longer(cols = -c(attr_name, newspaper_id), names_to = "year", values_to = "value") %>% filter(!is.na(value)) %>% # 去掉该年份无记录的空值 pivot_wider(names_from = attr_name, values_from = value) %>% # 附加地点列、生成唯一标识 mutate( Location = sheet_name, unique_id = paste(Location, newspaper_id, year, sep = "_") ) %>% # 重命名列匹配目标格式 rename( `Title of Newspaper` = `Title of Newspaper`, Language = `(Language)`, Ideology = `(Ideology)`, Owner = `(Owner)`, Editor = `(Editior)`, `Publication Frequency` = `(Publication Frequency)`, Circulation = `(Circulation)`, Others = `(Others)` ) return(processed) }
步骤3:批量处理所有Sheet并合并全量数据
# 替换为你的Excel文件路径 file_path <- "你的历史报纸数据集.xlsx" # 获取所有Sheet名(即所有地点) all_sheets <- excel_sheets(file_path) # 批量处理所有Sheet并合并 full_data <- map_dfr(all_sheets, ~process_single_sheet(file_path, .x)) # 导出结果为CSV(可根据需求更换导出格式) write_csv(full_data, "全量历史报纸处理结果.csv", na = "")
注意事项
- 若读取时出现多语言乱码,可在
read_excel函数中指定locale = locale(encoding = "GBK" / "Shift-JIS" / "UTF-8")匹配文件原始编码 - 如需单独按年份输出矩阵,可对最终全量表按
year列分组后批量导出即可 - Circulation列的引号、千位逗号可通过正则表达式批量清理后转换为数值类型,按需添加处理逻辑即可
内容的提问来源于stack exchange,提问作者Thorsten Kahlert
相关产品推荐
相关产品推荐

