1

问题描述

我正在尝试遍历电子表格中的多个工作表,以将第一行作为列名,将第 11+ 行作为数据。我希望将它们作为单个数据框导入。我遇到了麻烦,因为工作表中有 10 个标题行,而且我似乎无法在不丢失数据的情况下聚合工作表。

数据

相关文件可在ABS 网站此页面的表 6 中找到。

我的尝试

第一个块负责将数据放入 r 中。map 函数自然会生成一个列表列表,其中包含在名称包含文本“Data”的工作表中找到的数据(这样做是因为这些电子表格中的每一个中都有两张包含一些不相关信息的工作表)。

但是我想要数据框中的输出,所以我尝试使用 map_df 函数,但是第一个之后电子表格中的所有数据都被导入为 NA 值(不正确)。

library(tidyverse)
library(stringr)

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

第二个块获取每个工作表中的列名,以便它们可以应用于 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 的情况下在单个数据框中导入数据,那就太好了。向我展示如何一步完成的奖励积分,无需第二个块来命名列。

4

1 回答 1

1

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

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

如果要保留原始标题名称:

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)
于 2017-10-13T03:14:18.193 回答