在mutate之外使用nest和purrr :: map

时间:2017-09-28 01:27:43

标签: r dplyr tidyr purrr

让我们说我想根据他们的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'))))

有没有办法在by_cyl对象上执行此操作而不调用mutate?

2 个答案:

答案 0 :(得分:6)

以下是purrr使用mutatedplyr 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'))) 列。

library(tidyverse)
by_cyl <- mtcars %>% 
  group_by(cyl) %>%
  nest()
by_cyl %>%
  split(.$cyl) %>%
  walk2(names(.), ~write_csv(.x[["data"]][[1]], paste0(.y, '.csv')))

UPDATE2

{{1}}

答案 1 :(得分:0)

以下是dogroup_by的解决方案,因此,如果您的数据已按预期分组,则可以保存一行:

mtcars %>%
  group_by(cyl) %>%
  do(data.frame(write.csv(.,paste0(.$cyl[1],".csv"))))

data.frame仅在此处使用,因为do需要返回data.frame,因此它有点黑客。