запись из вложенного информационного кадра с именем файла «на лету» с использованием purrr :: walk - PullRequest
0 голосов
/ 02 мая 2018

Я применяю функцию к вложенному фрейму данных, используя 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")})

1 Ответ

0 голосов
/ 02 мая 2018

Использование 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')))
...