1.1 readxl

readxl软件包使R获取Excel数据变得方便简洁。与现有的软件包(例如:xlsx)相比,readxl没有外部依赖性,xlsx等包依赖java环境。readxl包容易在所有的操作系统安装使用。

readxl项目地址,本节大部分代码来源项目官网介绍,可自行查阅官网。

1.1.1 安装

从CRAN安装最新发行版本的最简单方法是安装整个tidyverse。

install.packages("tidyverse")

由于readxl不是tidyverse核心加载包,使用时仅需加载library(readxl)

或者是从CRAN仅安装readxl;

install.packages("readxl")

从github安装开发版:

# install.packages("devtools")
devtools::install_github("tidyverse/readxl")

1.1.2 用法

1.读取

readxl包中包含了几个示例文件,我们在接下来的案例中使用。

  • 查看readxl包中自带xlsx文件
library(readxl)
readxl_example()
readxl_example("clippy.xls")

read_excel()可读取xls和xlsx文件。

xlsx_example <- readxl_example("datasets.xlsx")
dt <- read_excel(xlsx_example)

# 查看数据
head(dt)

# 查看数据类型
str(dt)

通过函数excel_sheets()查看Excel的sheet名称

excel_sheets(xlsx_example)

指定worksheet的名字读取,可以是sheet的名字或序号。

当我们要读取的本地xlsx文件有多个sheets时,通过指定sheet参数读取指定的sheet。

read_excel(xlsx_example, sheet = "chickwts")
# not run
#read_excel(xlsx_example, sheet = 1)
#read_excel(xlsx_example, sheet = 3)

读取xlsx文件的指定范围,有多种方法控制。

本处提供几个案例,详情请?read_excel()查看帮助。

readxl::read_excel参数如下:

read_excel(path, sheet = NULL, range = NULL, col_names = TRUE,
  col_types = NULL, na = "", trim_ws = TRUE, skip = 0,
  n_max = Inf, guess_max = min(1000, n_max),
  progress = readxl_progress(), .name_repair = "unique")

range接受单元格范围,最简单的表示方式即Excle中单元格表示方法,如as range = “D12:F15” or range = “R1C12:R6C15”。

其余参数中,个人觉得col_types比较重要,可以指定列的类型。可用选项:“skip,” “guess,” “logical,” “numeric,” “date,” “text” or “list”。 .name_repair 参数能自动避免重复字段,可避免手工Excle出现的字段名不唯一的情况。

1.1.3 批量读取

某文件夹下有大量相同的Excel文件(sheet名称以及列字段相同),要合并全部Excel数据,代码如下:

allfiles <- list.files(path = './data/',pattern = '.xlsx$',full.names = T)
purrr::map_dfr(allfiles,read_excel)

1.1.4 批量输出

我们按照一定条件拆解数据集,分别输出,代码如下:

library(tidyverse)
dt <- read_xlsx(path = './data/read-write/批量读写.xlsx')


dt %>% 
  group_by(name) %>% 
  group_walk(~ write.csv(.x,file = file.path('data/read-write',paste0(.y$name,'.csv'))))
list.files(path = 'data/read-write/')

暂时不用理解批量读取和输出的代码具体含义,可以先记住用法。