将purrr :: walk2()应用于管道末端的data.frames的data.frame

ohn*_*lus 3 r purrr

我有一个R数据框,其中有一列数据框,我想将每列数据打印到一个文件中:

df0 <- tibble(x = 1:3, y = rnorm(3))
df1 <- tibble(x = 1:3, y = rnorm(3))
df2 <- tibble(x = 1:3, y = rnorm(3))

animalFrames <- tibble(animals = c('sheep', 'cow', 'horse'),
                       frames = list(df0, df1, df2))
Run Code Online (Sandbox Code Playgroud)

我可以使用for循环来做到这一点:

for (i in 1:dim(animalFrames)[1]){
    write.csv(animalFrames[i,2][[1]], file = paste0('test_', animalFrames[i,1], '.csv'))
}
Run Code Online (Sandbox Code Playgroud)

或具有purrrwalk2功能:

walk2(animalFrames$animals, animalFrames$frames,  ~write.csv(.y, file
= paste0('test_', .x, '.csv')))
Run Code Online (Sandbox Code Playgroud)

有什么方法可以将此游走功能放在magrittr管道的末端?

我在想类似的东西:

animalFrames %>% do({walk2(.$animals, .$frames, ~write.csv(.y, file = paste0('test_', .x, '.csv')))})
Run Code Online (Sandbox Code Playgroud)

但这给我一个错误:

Error: Result must be a data frame, not character
Traceback:

1. animalFrames %>% do({
 .     walk2(.$animals, .$frames, ~write.csv(.y, file = paste0("test_", 
 .         .x, ".csv")))
 . })
2. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
3. eval(quote(`_fseq`(`_lhs`)), env, env)
4. eval(quote(`_fseq`(`_lhs`)), env, env)
5. `_fseq`(`_lhs`)
6. freduce(value, `_function_list`)
7. withVisible(function_list[[k]](value))
8. function_list[[k]](value)
9. do(., {
 .     walk2(.$animals, .$frames, ~write.csv(.y, file = paste0("test_", 
 .         .x, ".csv")))
 . })
10. do.data.frame(., {
  .     walk2(.$animals, .$frames, ~write.csv(.y, file = paste0("test_", 
  .         .x, ".csv")))
  . })
11. bad("Result must be a data frame, not {fmt_classes(out)}")
12. glubort(NULL, ..., .envir = parent.frame())
13. .abort(text)
Run Code Online (Sandbox Code Playgroud)

大概是因为write.csv()正在返回数据帧,do()并且不处理那些或某些东西。

我并没有真正的编码要求,我必须在管道的末端放走(实际上,我总是可以在管道周围工作),但是似乎我缺少一些基本的知识,这困扰着我。有什么建议么?

Cal*_*You 5

我认为您根本不需要do。以下两项都对我有用。第一个与您的减号完全相同do,第二个利用magrittr的便捷%$%运算符将列名公开给,walk2并避免使用.$。请注意,如果这是在管道的末尾,则无论使用walk2还是无关紧要,都无关紧要,map2因为在此步骤之后,返回的内容并不重要。

注:我也换出,paste0write.csvtidyverse等效出于习惯,但他们很容易放在后面。

library(tidyverse)
df0 <- tibble(x = 1:3, y = rnorm(3))
df1 <- tibble(x = 1:3, y = rnorm(3))
df2 <- tibble(x = 1:3, y = rnorm(3))

animalFrames <- tibble(animals = c('sheep', 'cow', 'horse'),
                       frames = list(df0, df1, df2))

animalFrames %>%
  walk2(
    .x = .$animals,
    .y = .$frames,
    .f = ~ write_csv(.y, str_c("test_", .x, ".csv"))
  )

library(magrittr)
#> 
#> Attaching package: 'magrittr'
#> The following object is masked from 'package:purrr':
#> 
#>     set_names
#> The following object is masked from 'package:tidyr':
#> 
#>     extract
animalFrames %$%
  walk2(
    .x = animals,
    .y = frames,
    .f = ~ write_csv(.y, str_c("test_", .x, ".csv"))
  )
Run Code Online (Sandbox Code Playgroud)

reprex软件包(v0.2.0)创建于2018-03-13。