You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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结构一致,请问哪里操作出错了?

问题原因

  1. rbind=T的合并逻辑缺陷:import_list的rbind=T参数会按列名合并所有Sheet,若不同Sheet的列名存在差异(即便数据结构一致),后续Sheet的对应列会被填充为NA。
  2. _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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:33:17