首页 > 解决方案 > 无法使用 dplyr 包设置工作表名称

问题描述

我正在将列表中的多个数据框导出到一个 excel 文件中的不同工作表中,我可以使用以下代码执行此操作(mtcars用作示例):

library(tidyverse)
library(ImportExport)

data_list <- split(mtcars, mtcars$cyl)
table_name <- names(data_list)

# Run
excel_export(data_list, "foo.xlsx", table_names = tab_name)

然后,我想用另一种方式做到这一点,因为我看到 dplyr 文档说:

.y引用键,一个一行小标题,每个分组变量一列标识组。

所以我认为.y等于我创建的变量table_name,我这样做:

data_list %>% excel_export("foo.xlsx", table_names = .y)

然后我得到一个错误:

.jcall 中的错误(wb,“Lorg/apache/poi/ss/usermodel/Sheet;”,“createSheet”,:找不到对象'.y'

有人可以解释为什么以及如何使用.y.

任何帮助将不胜感激。

标签: rdplyr

解决方案


  1. 如果你引用一个引用,我认为使用引用该引用的函数是有意义的。在这种情况下,我发现了它group_map(其中包括group_walk一个主要在副作用中起作用的补充功能)。

  2. 你仍然需要group_by数据。更具体地说,它需要在一个tbl_df(不是 a list)上操作,通常(但不总是)一个分组的tibble。

我既没有ImportExport也没有xlsx安装(前者依赖于),所以我会用write.csv.

library(dplyr)
mtcars %>%
  group_by(cyl) %>%
  group_walk(~ write.csv(.x, paste0(.y, ".csv")))

这样做的副作用是在当前目录中创建了三个文件,分别名为4.csv6.csv8.csv

如果要对命名列表进行操作,还可以使用以下之一:

# using: data_list <- split(mtcars, mtcars$cyl)
purrr::imap(data_list,
            ~ write.csv(.x, paste0("~/Downloads/", .y, ".csv")))
Map(write.csv, data_list, paste0(names(data_list), ".csv"))

效果是一样的。


推荐阅读