使用 readxl 导入数据

Importing data using readxl

问题描述

我正在尝试遍历多个 sheet 展开 sheet 以选择第一行作为列名,第 11 行以上作为数据。我希望将它们导入为单个数据框。我遇到了麻烦,因为 sheet 中有 10 header 行,我似乎无法在不丢失数据的情况下聚合 sheet。

数据

有问题的文件位于 ABS 网站 this page 的 Table 6。

我的尝试

第一个块负责将数据导入 r 的繁重工作。 map 函数自然会产生一个列表列表,其中包含在 sheet 中找到的数据,其名称包含文本“数据”(这样做是因为每个传播中都有两个 sheet sheet 包含一些不相关的信息)。

但是我想要数据帧中的输出所以我尝试使用 map_df 函数但是来自 spreadsheets first 之后的所有数据是作为 NA 值导入(不正确)。

library(tidyverse)
library(stringr)

df1 <- path %>% 
  excel_sheets() %>% 
  str_subset("Data") %>%
  map(read_excel, path = path, skip = 9)

第二个块选取每个 sheet 中的列名称,以便它们可以应用于 df1。

nms <- path %>% 
  excel_sheets() %>% 
  str_subset("Data") %>%
  map_df(read_excel, path = path, n_max = 0, col_names = T) %>% 
  mutate(
    date = 1
  ) %>% 
  select(
    date, everything()
  )

names(df1) <- names(nms)

如果有人能告诉我如何在单个数据框中导入没有 NA 的数据,那就太好了。向我展示如何一步完成的奖励积分,而不需要第二个块来命名列。

不确定您要查找什么,但如果您想阅读该工作簿中的所有工作表,请保留并跳过前 9 行。然后,您只需要使用 left_join 通过 reduce 将这些全部拼接在一起即可摆脱 NA 值。

df1 <- path %>% 
  excel_sheets() %>% 
  str_subset("Data") %>%
  map(~read_excel(file, .x, skip = 9)) %>% 
  reduce(left_join, by = "Series ID")

如果您想保留原来的 header 姓名:

path %>%
  excel_sheets() %>%
  str_subset("Data") %>%
  map(~read_excel(file, .x, col_names = FALSE) %>%
        set_names(., c("Series ID", .[1, 2:ncol(.)])) %>%
        slice(-1:-10)) %>%
  reduce(left_join, by = "Series ID") %>% 
  mutate_at(vars(-`Series ID`), as.numeric)