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

kma*_*ace 4 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'))))
Run Code Online (Sandbox Code Playgroud)

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

www*_*www 6

这是一个使用purrr没有mutate来自的选项dplyr.

library(tidyverse)
mtcars %>%
  split(.$cyl) %>%
  walk2(names(.), ~write_csv(.x, paste0(.y, '.csv')))
Run Code Online (Sandbox Code Playgroud)

更新

这会cyl在保存输出之前删除列.

library(tidyverse)
mtcars %>%
  split(.$cyl) %>%
  map(~ .x %>% select(-cyl)) %>%
  walk2(names(.), ~write_csv(.x, paste0(.y, '.csv')))
Run Code Online (Sandbox Code Playgroud)

UPDATE2

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

  • 您的回答很好。最后,我使用`pull`而不是索引对其进行了少许修改。我基本上将Update2的最后一行替换为:`walk(〜write.csv(.x%&gt;%pull(data)%&gt;%as.data.frame,paste0(.x%&gt;%pull(cyl),')。 csv')))` (2认同)