3.5 readxl

要想将其他类型的数据导入 R 中,可以先从下列的 tidyverse 包开始。对矩形型数据来说:

  • haven 可以读取 SPSS、Stata 和 SAS文件:

  • 配合专用的数据库后端程序(如 RMySQL,RSQLite,RpostgreSQL等),DBI可以对相应数据库进行SQL查询,并返回一个数据框

  • readxl 专门为读取 Excel 文件打造(.xlsx和xls均可)

下面主要介绍 readxl 的用法,不同于readrreadxl 不是 tidyverse 的核心包,我们总需要显示地加载它:

read_excel()readxl 中的核心函数,它的第一个参数path接受 xlsxxls 文件的路径。但由于一个 Excel 文件(工作簿)经常包含多个工作表,所以我们在读取时需要指明某张工作表,excel_sheets() 函数返回一个工作簿文件中各个工作表(sheet)的名字:

获悉一个工作簿内部的表结构以后,可以使用 sheets 参数指定要读取的表,可以是一个整数(第几张彪),也可以是字符串(表明), read_excel() 默认读取第一张表:

经常会在读取 Excel 文件时遇到的一个问题是,有些人喜欢在表格的前面几行或最后几行添加一些元数据(metadata),比如在 deaths.xlsx 中:

默认设置下,read_excel() 会将这些元数据一并读入:

一个很有用的方法是通过 Sstudio 的 File \(\rightarrow\) Import Dataset \(\rightarrow\) From Excel 接口导入数据,我们可以通过预览来观察导入后的数据,还可以对read_excel()的导入参数进行设置:

对于deaths.xlsx这个Excel文件,可以结合使用n_maxskip 参数去除不想读取的部分(分别对应图形界面里的Max Rows和Skip:

read_excel() 中另一个很有用的参数是 range,用于指定一块 Excel 表中要读取的区域:

range 相关的帮助函数cell_rows()cell_cols()cell_limits()可以为区域选择提供更大的自由度,下面的示例中使用文件geometry.xls,读取预览:

3.5.1 Multi-row headers in Excel

https://debruine.github.io/posts/multi-row-headers/

In section 3.4.5 (Example: multi-row headers) we learn how to tackle with multi-row-headers in a text File. In Excel this is trickier. But the ultimate goal is always firrst extracting header rows (more than 1), composing one formatted row header and then set it to col_names when importing, and skip the some rows in the original data.

Extracting head rows

Currently I have come up with no ways of dealing with data_hand in this given form without resorting to the weird t(). So I followed the blog and transpose it to take advantage of tidyr::fill(). Yet I feel that there is some function in the slider package could solve this. I will look into this and may update the solution.