为每次迭代调用新的数据帧:循环数据帧?
Call new data frame for each iteration: Loop through data frames?
我正在设计一个模拟,它使用来自两个独立数据帧(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
(例如,在此示例中,我将使用 year1991
为第二次迭代重新分配 year
),但我确信有更好的方法可以使整个过程自动化。谢谢!
只需将对象保存在一个命名列表中(如果它们最初位于具有 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)
我正在设计一个模拟,它使用来自两个独立数据帧(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
(例如,在此示例中,我将使用 year1991
为第二次迭代重新分配 year
),但我确信有更好的方法可以使整个过程自动化。谢谢!
只需将对象保存在一个命名列表中(如果它们最初位于具有 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)