Сохранение нескольких кадров данных в формате l oop в виде отдельного CSV - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь сохранить несколько (> 600) тиблей / фреймов данных в формате CSV в течение l oop. Причина, по которой я хочу сохранить их отдельно, состоит в том, что они имеют столбцы и строки разных размеров. К сожалению, это не работает. Неважно, являются ли они фреймом данных, я получу ту же ошибку.

Я также попробовал write.csv, но это не сохраняет фактический фрейм данных. Вместо этого он создает CSV со словом «events355486» в первой ячейке. Существуют ли мастера R, которые могут мне помочь?

Пример кода здесь:

library(tidyverse)
match_id_test <- tibble( match_id = c(355486, 487627, 793011, 
                                       845722, 949077, 1022888),
                          game_id  = c("game355486", "game487627","game793011", 
                                       "game845722", "game949077", "game1022888"),
                          events_id = c("events355486", "events487627","events793011", 
                                        "events845722", "events949077", "events1022888")
                          )
events355486 <- tibble(x = 1:1, y= 1:1)
events487627 <- tibble(x = 1:2, y= 1:2)
events793011 <- tibble(x = 1:3, y= 1:3)
events845722 <- tibble(x = 1:4, y= 1:4)
events949077 <- tibble(x = 1:5, y= 1:5)
events1022888 <- tibble(x = 1:6, y= 1:6)
for (i in 1:nrow(match_id_test)){
    write_csv(paste0("events", match_id_test[i,1]),
              here(paste0("./Data/Events",match_id_test[i,1], ".csv")
              )
    )
}
#> Error in write_delim(x, path, delim = ",", na = na, append = append, col_names = col_names, : is.data.frame(x) is not TRUE

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

С lapply вы можете попробовать:

lapply(match_id_test$events_id, function(x) 
       write.csv(get(x), paste0('./Data/Events/', x, '.csv'), row.names = FALSE))

Или с помощью mget с purrr:imap

purrr::imap(mget(match_id_test$events_id), 
       ~write.csv(x, paste0('./Data/Events/', .y, ".csv"), row.names = FALSE))
0 голосов
/ 13 февраля 2020

Используя пакет purrr, как описано Ронаком, но с map2 и используя функции readr, это работает:

map2(match_id_test$events_id,
     match_id_test$match_id,
    function(.x, .y){
      get(.x) %>% 
        write_csv(
          here::here(
            paste0(
              "./Data/Events", .y, ".csv"
            )))
    })
0 голосов
/ 13 февраля 2020

Может быть, это:

for (i in 1:nrow(match_id_test)){
  write_csv(get(paste0("events", match_id_test[i,1])),
            paste0("./Data/Events", match_id_test[i,1], ".csv")
  )
}
...