Вызов нового фрейма данных для каждой итерации: цикл по фреймам данных? - PullRequest
0 голосов
/ 20 сентября 2018

Я проектирую симуляцию, которая итеративно запускает блок кода, используя входные данные из двух отдельных фреймов данных (df и year).Полученный фрейм данных представляет собой измененную версию df, которая затем сохраняется на моем жестком диске под двумя отдельными именами файлов: одно постоянно хранится для последующего анализа, а другое - для следующей итерации.

Вот моя проблема: фрейм данных year должен представлять собой абсолютно новый фрейм данных для каждой итерации (т. Е. Данные следующего года).

Может ли это быть выполнено с помощью чего-то вроде цикла for, где индекс [i] - это фрейм данных следующего года (а не строка в фрейме данных, как я понимаю для работы циклов)?Я подозреваю, что ответ включает в себя список?Вот некоторые фиктивные данные, пытающиеся продемонстрировать проблему:

df <- tibble(
  x = 1:25,
  y = rnorm(25, 22, 8))

year1990 <- tibble(
  Year = 1990, 
  DayOfYear = 1:6, 
  temp = seq(0, 20, 4))

year1991 <- tibble(
  Year = 1991, 
  DayOfYear = 1:6, 
  temp = seq(0, 25, 5))

year1992 <- tibble(
  Year = 1992, 
  DayOfYear = 1:6, 
  temp = seq(0, 15, 3))

#### Beginning of Code to Be Repeated ####

year <- year1990         # Start with this year, BUT each subsequent iteration needs the following year's data
df$survive <- ifelse(max(year$temp) <= df$y, "Dead", "Live")
write.csv(df, "location/f.csv",row.names=FALSE)  # Write temporary CSV to be recalled
write.csv(df, paste(year[1,1], ".csv", sep = ""), row.names = FALSE)      # Write permanent CSV for storage

#### End of Code to Be Repeated ####

# Reload the newly modified data frame
setwd()
df <- read.csv("df.csv")  

В настоящее время я вручную перезагружаю df и сбрасываю year для каждой итерации (например, я бы переназначил year, используя year1991для второй итерации в этом примере), но я уверен, что есть лучший способ автоматизировать весь процесс.Спасибо!

1 Ответ

0 голосов
/ 20 сентября 2018

Просто сохраните объекты в именованном списке (который можно создать, если они изначально были в одном фрейме данных с split или by).Затем поэлементно циклически с Map (оболочкой для mapply) просматривайте имена и объекты списка через определенный процесс для циклического *

year_list <- list(
  year1990 = tibble(Year = 1990, DayOfYear = 1:6, temp = seq(0, 20, 4)),    
  year1991 = tibble(Year = 1991, DayOfYear = 1:6, temp = seq(0, 25, 5)),    
  year1992 = tibble(Year = 1992, DayOfYear = 1:6, temp = seq(0, 15, 3))
)

proc <- function(n, d) {    
    year <- d        
    df$survive <- ifelse(max(year$temp) <= df$y, "Dead", "Live")
    write.csv(df, "location/f.csv", row.names = FALSE)  

    # Write temporary CSV to be recalled
    write.csv(df, paste0(n, ".csv"), row.names = FALSE)  

    return(df)
}

# ITERATIVELY SAVES CSVs AND RETURNS dfs WITH UPDATED survive COLUMN
output_list <- Map(proc, names(year_list), year_list)
...