【问题标题】:write from nested dataframe with on-the-fly filename using purrr::walk使用 purrr::walk 从具有动态文件名的嵌套数据帧写入
【发布时间】:2018-10-12 20:18:21
【问题描述】:

我正在使用 purrr::map 将函数应用于嵌套数据框,以获取新的数据框列表列。

现在我想使用同一行中的列值作为文件名的一部分将这些新数据帧中的每一个写入文件。

我不知道如何提取其他列值以便传递给文件名以写入文件。我相信purrr::walk 应该参与其中,但如何访问列变量列表数据框内容的方式是问题所在。

下面的例子:

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")})

【问题讨论】:

    标签: r tidyr purrr


    【解决方案1】:

    使用pwalk:

    ... %>%
    select(cyl, case, new_mpg) %>%
    pwalk(~ write.csv(..3, file = paste0(..1, '_', ..2, '.csv')))
    

    在你的代码之后链接:

    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')))
    

    【讨论】:

    • 作为替代方案,如果您想引用这些列的名称而不是简写,您可以使用pwalk(function(cyl, case, new_mpg) write.csv(new_mpg, paste0(cyl, "_", case, ".csv"))。我总是对..x..1 等有问题,自己拼出来
    • 我觉得pwalk(function(cyl, case, new_mpg)... 很有用。为了清楚传递的内容@camille
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2018-05-11
    • 2018-10-11
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多