使用rio包import_list导入多Sheet Excel至R时非首Sheet全为NA的问题
解决rio包import_list导入多Sheet时数据为NA的问题
我使用rio包将一个Excel文件导入到tidyverse环境中,仅需其中前两列:邮编(plz)和人口数(einwohner)。逐个导入单个Sheet的方法可行,但操作繁琐:
library(tidyverse) library(rio) url <- "https://dam-api.bfs.admin.ch/hub/api/dam/assets/32229177/master" bev22 <- import(url, setclass="tibble", skip=3, sheet="2022") %>% select(plz=1, einwohner=2) bev20 <- import(url, setclass="tibble", skip=3, sheet="2020") %>% select(plz=1, einwohner=2)尝试用
import_list批量导入时,除第一个Sheet外其余数据均为NA,且未正确保留年份名称:bev <- import_list(url, setclass="tibble", skip=3, rbind=T) %>% select(plz=1, einwohner=2, sheet="_file")执行以下代码验证后,仅第一个Sheet有有效数据:
bev %>% drop_na() %>% count(sheet)所有Sheet结构一致,请问哪里操作出错了?
问题原因
rbind=T的合并逻辑缺陷:import_list的rbind=T参数会按列名合并所有Sheet,若不同Sheet的列名存在差异(即便数据结构一致),后续Sheet的对应列会被填充为NA。_file列并非Sheet名称:select(..., sheet="_file")获取的是文件路径,不是Sheet的名称,无法用来区分不同年份的数据。
正确解决方案
先将所有Sheet导入为列表,逐个处理每个Sheet(按位置选取前两列并重命名),同时通过.id参数保留Sheet名称作为年份标识,最后合并为单个tibble:
library(tidyverse) library(rio) url <- "https://dam-api.bfs.admin.ch/hub/api/dam/assets/32229177/master" # 导入所有Sheet为列表,不直接合并 bev_list <- import_list(url, setclass = "tibble", skip = 3) # 遍历列表处理每个Sheet,添加年份列并合并 bev <- map_dfr(bev_list, ~ select(.x, plz = 1, einwohner = 2), .id = "jahr")
代码说明
import_list(..., skip=3):确保每个Sheet都跳过前3行,正确读取数据起始行。map_dfr(..., .id = "jahr"):遍历列表中的每个Sheet,对每个Sheet执行select操作(按位置取前两列并重命名),并将Sheet名称存入jahr列,最后自动合并为行绑定的tibble。- 这种方式避免了直接合并时的列名匹配问题,保证所有Sheet的数据都能正确读取,同时保留了年份信息。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

