在 mutate 之外使用 nest 和 purrr::map
Using nest and purrr::map outside of mutate
假设我想根据 cyl 分组将 mtcars 分成 3 个 csv 文件。我可以使用 mutate 来执行此操作,但它会在输出中创建一个 NULL
列。
library(tidyverse)
by_cyl = mtcars %>%
group_by(cyl) %>%
nest()
by_cyl %>%
mutate(unused = map2(data, cyl, function(x, y) write.csv(x, paste0(y, '.csv'))))
有没有办法在不调用 mutate 的情况下对 by_cyl 对象执行此操作?
这是一个使用 purrr
的选项,没有 dplyr
的 mutate
。
library(tidyverse)
mtcars %>%
split(.$cyl) %>%
walk2(names(.), ~write_csv(.x, paste0(.y, '.csv')))
更新
这会在保存输出之前删除 cyl
列。
library(tidyverse)
mtcars %>%
split(.$cyl) %>%
map(~ .x %>% select(-cyl)) %>%
walk2(names(.), ~write_csv(.x, paste0(.y, '.csv')))
更新2
library(tidyverse)
by_cyl <- mtcars %>%
group_by(cyl) %>%
nest()
by_cyl %>%
split(.$cyl) %>%
walk2(names(.), ~write_csv(.x[["data"]][[1]], paste0(.y, '.csv')))
这是一个使用 do
和 group_by
的解决方案,所以如果您的数据已经按照应有的方式分组,您可以保存一行:
mtcars %>%
group_by(cyl) %>%
do(data.frame(write.csv(.,paste0(.$cyl[1],".csv"))))
data.frame
只用在这里,因为do
需要return一个data.frame
,所以有点hack。
假设我想根据 cyl 分组将 mtcars 分成 3 个 csv 文件。我可以使用 mutate 来执行此操作,但它会在输出中创建一个 NULL
列。
library(tidyverse)
by_cyl = mtcars %>%
group_by(cyl) %>%
nest()
by_cyl %>%
mutate(unused = map2(data, cyl, function(x, y) write.csv(x, paste0(y, '.csv'))))
有没有办法在不调用 mutate 的情况下对 by_cyl 对象执行此操作?
这是一个使用 purrr
的选项,没有 dplyr
的 mutate
。
library(tidyverse)
mtcars %>%
split(.$cyl) %>%
walk2(names(.), ~write_csv(.x, paste0(.y, '.csv')))
更新
这会在保存输出之前删除 cyl
列。
library(tidyverse)
mtcars %>%
split(.$cyl) %>%
map(~ .x %>% select(-cyl)) %>%
walk2(names(.), ~write_csv(.x, paste0(.y, '.csv')))
更新2
library(tidyverse)
by_cyl <- mtcars %>%
group_by(cyl) %>%
nest()
by_cyl %>%
split(.$cyl) %>%
walk2(names(.), ~write_csv(.x[["data"]][[1]], paste0(.y, '.csv')))
这是一个使用 do
和 group_by
的解决方案,所以如果您的数据已经按照应有的方式分组,您可以保存一行:
mtcars %>%
group_by(cyl) %>%
do(data.frame(write.csv(.,paste0(.$cyl[1],".csv"))))
data.frame
只用在这里,因为do
需要return一个data.frame
,所以有点hack。