使用rio包将多个Excel工作表导入单个DataFrame,将标识列值替换为工作表名称
解决方法:将rio导入的
file列替换为工作表名称 这问题很好解决,你只需要先获取Excel文件里的所有工作表名称,然后替换掉默认生成的file列里的数字就行,或者换一种更直接的导入方式,直接把工作表名称作为列值添加进去。给你两种方案:
方案一:快速修改现有导入结果
这种方法在你原有代码的基础上做最小改动:
- 先获取目标Excel文件的所有工作表名称:
library(rio) # 获取所有工作表名称 sheet_names <- excel_sheets("EA 2016/Emission-relevant Energy Accounts_total.xlsx")
- 执行你原来的导入代码:
WIOD_EA_EmRelEnergy <- import_list("EA 2016/Emission-relevant Energy Accounts_total.xlsx", setclass = "tbl", rbind = TRUE)
- 把
file列的数字索引替换为对应的工作表名称:
# 如果用tidyverse的写法 library(dplyr) WIOD_EA_EmRelEnergy <- WIOD_EA_EmRelEnergy %>% mutate(file = sheet_names[file]) # 不用tidyverse的基础R写法 WIOD_EA_EmRelEnergy$file <- sheet_names[WIOD_EA_EmRelEnergy$file]
这样file列的值就会变成对应的国家代码(比如"AUS"、"AUT"),而不是原来的数字序号了。
方案二:导入时直接添加工作表名称(更灵活)
如果你想自定义列名(比如不想用file这个列名),或者需要对每个工作表做额外预处理,推荐这种方法:
library(rio) library(tidyverse) # 获取工作表名称 sheet_names <- excel_sheets("EA 2016/Emission-relevant Energy Accounts_total.xlsx") # 循环读取每个工作表,添加自定义列名的工作表名称,再合并 WIOD_EA_EmRelEnergy <- map2(sheet_names, sheet_names, function(sheet_id, sheet_name) { # 读取单个工作表 import("EA 2016/Emission-relevant Energy Accounts_total.xlsx", sheet = sheet_id, setclass = "tbl") %>% # 添加工作表名称列,这里可以自定义列名,比如叫country_code mutate(country_code = sheet_name) }) %>% # 合并所有表 bind_rows()
这种方法的好处是你可以自由控制列名,而且如果后续需要对不同国家的数据做单独处理,也能在循环里直接添加逻辑。
内容的提问来源于stack exchange,提问作者VBo
相关产品推荐
相关产品推荐

