使用readxl

时间:2017-10-13 02:32:14

标签: r tidyverse import-from-excel readxl

问题描述

我试图在电子表格中迭代多张工作表,将第一行作为列名称,将第11行作为数据。我希望将它们作为单个数据帧导入。我遇到了麻烦,因为表格中有10个标题行,而且我似乎无法在不丢失数据的情况下汇总表格。

数据

有关文件见ABS网站this page表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的情况下导入数据,那么单个数据框就会很棒。奖励积分,用于向我展示如何在一个步骤中执行此操作,而无需第二个块来命名列。

1 个答案:

答案 0 :(得分: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)