我正在将列表中的多个数据帧导出到一个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
。
如有任何帮助,我们将不胜感激。
-
如果引用一个引号,我认为使用该引号所在的函数是有意义的。在这种情况下,我在
group_map
中找到了它(其中包括group_walk
,一个主要用于副作用的互补函数(。 -
您仍然需要
group_by
数据。更具体地说,它需要在tbl_df
(而不是list
(上操作,通常(但不总是(是分组的tibble。
我没有安装ImportExport
和xlsx
(前者依赖于它们(,所以我将用write.csv
代理您的操作。
library(dplyr)
mtcars %>%
group_by(cyl) %>%
group_walk(~ write.csv(.x, paste0(.y, ".csv")))
这样做的副作用是在当前目录中创建了三个名为4.csv
、6.csv
和8.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)