R语言数据处理与基础操作:失败处理、多输出保存及子集选择
立即解锁
发布时间: 2025-09-04 00:55:30 阅读量: 7 订阅数: 19 AIGC 

### R语言数据处理与基础操作:失败处理、多输出保存及子集选择
#### 1. 处理数据读取失败情况
在数据处理过程中,有时数据结构复杂,无法用单一命令读取所有文件。`map()` 函数在处理文件读取时存在一个缺点,它要么成功读取目录下所有文件,要么因一个错误而失败,导致零文件读取。这就很让人困扰,为什么一个失败会阻止我们访问其他成功读取的数据呢?
为了解决这个问题,`purrr` 包提供了 `possibly()` 函数。它是一个函数操作符,接受一个函数并返回一个行为经过修改的函数。具体来说,`possibly()` 会将一个原本报错的函数修改为返回指定值的函数。示例代码如下:
```R
files <- paths |>
map(possibly(\(path) readxl::read_excel(path), NULL))
data <- files |> list_rbind()
```
这里 `list_rbind()` 函数和许多 `tidyverse` 函数一样,会自动忽略 `NULL` 值,所以这种处理方式很有效。
接下来,我们需要找出哪些文件读取失败了。可以通过以下步骤实现:
```R
failed <- map_vec(files, is.null)
paths[failed]
```
#### 2. 保存多个输出
前面我们学习了 `map()` 函数用于将多个文件读取到一个对象中,现在我们来探讨相反的问题:如何将一个或多个 R 对象保存到一个或多个文件中。下面通过三个例子来详细说明。
##### 2.1 保存多个数据框到一个数据库
当同时处理多个文件时,可能无法将所有数据一次性加载到内存中,这时可以将数据加载到数据库中,使用 `dbplyr` 来访问所需的数据。
如果使用的数据库包提供了一个方便的函数,能将路径向量中的所有文件加载到数据库中,那就很方便了,例如 `duckdb` 的 `duckdb_read_csv()` 函数:
```R
con <- DBI::dbConnect(duckdb::duckdb())
duckdb::duckdb_read_csv(con, "gapminder", paths)
```
但如果我们处理的是 Excel 电子表格,就需要手动操作了。具体步骤如下:
1. 创建一个模板数据框,包含所需的所有列,但只包含部分数据。以 `gapminder` 数据为例:
```R
template <- readxl::read_excel(paths[[1]])
template$year <- 1952
```
2. 连接到数据库,并使用 `DBI::dbCreateTable()` 函数将模板转换为数据库表:
```R
con <- DBI::dbConnect(duckdb::duckdb())
DBI::dbCreateTable(con, "gapminder", template)
```
3. 创建一个函数,用于读取单个文件并将结果添加到 `gapminder` 表中:
```R
append_file <- function(path) {
df <- readxl::read_excel(path)
df$year <- parse_number(basename(path))
DBI::dbAppendTable(con, "gapminder", df)
}
```
4. 调用 `append_file()` 函数处理每个文件路径。这里使用 `walk()` 函数更合适,因为我们不关心函数的输出:
```R
paths |> walk(append_file)
```
5. 检查数据是否都已添加到表中:
```R
con |>
tbl("gapminder") |>
count(year)
```
##### 2.2 保存多个数据框到多个 CSV 文件
假设我们要将 `ggplot2::diamonds` 数据按 `clarity` 分组,为每个组保存一个 CSV 文件。具体操作步骤如下:
1. 使用 `group_nest()` 函数创建分组数据集:
```R
by_clarity <- diamonds |>
group_nest(clarity)
```
2. 创建一个包含输出文件名称的列:
```R
by_clarity <- by_clarity |>
mutate(path = str_glue("diamonds-{clarity}.csv"))
```
3. 使用 `walk2()` 函数将每个数据框保存为 CSV 文件:
```R
walk2(by_clarity$data, by_clarity$path, write_csv)
```
##### 2.3 保存多个绘图到多个 PNG 文件
我们可以采用类似的方法创建多个绘图并保存为 PNG 文件。具体步骤如下:
1. 创建一个绘制所需绘图的函数:
```R
carat_histogram <- function(df) {
ggplot(df, aes(x = carat)) + geom_histogram(binwidth = 0.1)
}
```
2. 使用 `map()` 函数创建绘图列表和对应的文件路径:
```R
by_clarity <- by_clarity |>
mutate(
plot = map(data, carat_histogram),
path = str_glue("clarity-{clarity}.png")
)
```
3. 使用 `walk2()` 函数和 `ggsave()` 函数保存每个绘图:
```R
walk2(
by_clarity$path,
```
0
0
复制全文
相关推荐










