r-无法使用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

如有任何帮助,我们将不胜感激。

  1. 如果引用一个引号,我认为使用该引号所在的函数是有意义的。在这种情况下,我在group_map中找到了它(其中包括group_walk,一个主要用于副作用的互补函数(。

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

我没有安装ImportExportxlsx(前者依赖于它们(,所以我将用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"))

效果是一样的。

.x.y不是可以在任何地方使用的全局参数,它们是为特定函数保留的。(通常为map(

来自?map

.f函数、公式或向量(不一定是原子(。

如果一个公式,例如~.x+2,它被转换成一个函数。有三种方式可以引用这些论点:

  • 对于单参数函数,请使用
  • 对于双参数函数,请使用.x和.y
  • 有关更多参数,请使用。。1.2.3等

让我们来看一个简单的列表

library(purrr)
listvec1 <- list(a = 1:3, b = 4:6, c = 2:4)

1( 假设我们想把列表中的每个元素都乘以2,map只有一个参数,所以我们在这里使用.

map(listvec1, ~. * 2)
#$a
#[1] 2 4 6
#$b
#[1]  8 10 12
#$c
#[1] 4 6 8

巧合的是,.x也在这里工作:

map(listvec1, ~.x * 2)

但如果使用.y,则会出现错误,因为map中没有2个参数。

map(listvec, ~.y * 2)

.f(.x[[i]],…(中的错误:。。。列表包含少于2个元素

2(让我们取另一个列表,现在用listvec2添加listvec1。为此,我们可以使用map2,它有两个参数,因此在这里我们将它们称为.x.y

listvec2 <- list(a = 7, b = 8, c = 9)
map2(listvec1,listvec2, ~.x + .y)
#you could actually simplify this as but anyway this is just an example
#map2(listvec1,listvec2, `+`)
#$a
#[1]  8  9 10
#$b
#[1] 12 13 14
#$c
#[1] 11 12 13

同样,我们在imap中使用.x.y,其中.x是元素,.y是列表(如果存在(或索引的名称。


.y以上的帖子中没有任何意义,因此将其用作

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

肯定会产生错误。您需要使用如上所述的特定函数才能使用.x.y。因此,如果你想使用管道的命令,你应该使用

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

最新更新