使用purr::walk从嵌套数据帧中写入动态文件名
我使用purr::map将一个函数应用于嵌套的数据帧,以获得一个新的数据帧列表列 现在,我想使用同一行中的列值(作为文件名的一部分)将这些新数据帧写入文件 我被困在如何拉出其他列值以便传递给文件名以写入文件中。我相信应该包括purrr::walk,但问题在于如何访问列变量和列表数据帧内容 报告如下:使用purr::walk从嵌套数据帧中写入动态文件名,r,tidyr,purrr,R,Tidyr,Purrr,我使用purr::map将一个函数应用于嵌套的数据帧,以获得一个新的数据帧列表列 现在,我想使用同一行中的列值(作为文件名的一部分)将这些新数据帧写入文件 我被困在如何拉出其他列值以便传递给文件名以写入文件中。我相信应该包括purrr::walk,但问题在于如何访问列变量和列表数据帧内容 报告如下: library(tibble) library(dplyr) library(tidyr) library(purrr) # Data data("mtcars") mtcars_nest
library(tibble)
library(dplyr)
library(tidyr)
library(purrr)
# Data
data("mtcars")
mtcars_nest <- mtcars %>% rownames_to_column() %>% rename(rowname_1 = rowname) %>% select(-mpg) %>% group_by(cyl) %>% nest()
mtcars_mpg <- mtcars %>% rownames_to_column() %>% rename(rowname_2 = rowname) %>% select(rowname_2, mpg)
# Function to apply to nested dataframe
join_df <- function(df_nest, df_other) {
df_all <- inner_join(df_nest, df_other, by = c("rowname_1" = "rowname_2"))
return(df_all)
}
# 1. Apply function to `$data` to get new dataframe list column and add an extra 'case' column for filename
mtcars_nest %>%
mutate(case = c("first", "second", "third")) %>%
mutate(new_mpg = map(data, ~ join_df(., mtcars_mpg)))
# 2. Now write `$new_mpg` to file with filename sources from $cyl and $case
# I think `walk` is the correct to use but how to pass the two row values into filename?
## Not real code##
# mtcars_nest %>%
# walk(., function(x) {write.csv(., file = paste0(cyl, "_", case, ".csv")})
使用pwalk:
在您的代码后面添加链:
mtcars_nest %>%
mutate(case = c("first", "second", "third")) %>%
mutate(new_mpg = map(data, ~ join_df(., mtcars_mpg))) %>%
select(cyl, case, new_mpg) %>%
pwalk(~ write.csv(..3, file = paste0(..1, '_', ..2, '.csv')))
另一种方法是,如果希望引用这些列的名称而不是简写,可以使用pwalkfunctioncyl、case、new_mpg write.csvnew_mpg、paste0cyl、u、case、.csv。我总是在.,.x,…1等方面遇到麻烦,我只是自己把事情说清楚。我发现这对我来说很有用。。。。为了清楚地了解正在通过的内容@camille
mtcars_nest %>%
mutate(case = c("first", "second", "third")) %>%
mutate(new_mpg = map(data, ~ join_df(., mtcars_mpg))) %>%
select(cyl, case, new_mpg) %>%
pwalk(~ write.csv(..3, file = paste0(..1, '_', ..2, '.csv')))