循环在R中使用改变变量来写和命名文件



我试图在R中创建一个循环,读取我导入的netcdf文件的每日值并将其转换为年度总和,然后为每年创建一个光栅。我已经将netcdf转换为一个数组-这被命名为Biased_corrected。数组在我的代码下面。我不确定如何在我的文件名中包含变量"年",因为它随着循环的每次迭代而变化。我试过使用粘贴,但这似乎是它失败的地方。有什么建议吗?

# read in file specifying which days correspond to years
YearsDays <- read.csv("Data\Years.csv") # a df with 49 obs. of 3 variables (year, start day, and end day
YearsDays[1,2:3]  #returns 1 and 366 (the days for year 1972)
YearsDays[2,2:3]  #returns 367 and 731 (the days for year 1973)
YearsDays[1,1] #returns 1972
YearsDays[2,1] #returns 1973
counter <- 1
startyear <- YearsDays[1,1]
year <- startyear
while(year < 2021){
#set variables to loop through
startday <- YearsDays[counter,2]
endday <- YearsDays[counter,3]
BC_rain.slice <- Biased_corrected.array[,,startday:endday]
paste(year, "_Annual_rain") <- apply(BC_rain.slice, c(1,2), sum)

#save data in a raster
paste(year, "_rain_r") <- raster(t(paste(year, "_Annual_Rain"), xmn=min(x), xmx=max(x), ymn=min(y), ymx=max(y), crs=WGS84)


# move on to next year
counter <- counter + 1
year <- 1971 + counter
}

编辑:任何感兴趣的人的工作代码:

YearsDays <- read.csv("Data\Years.csv") # a df with 49 obs. of 3 variables (year, start day, and end day
for (idx in seq(nrow(YearsDays))){

#set variables to loop through
year <- YearsDays[idx,1]
startday <- YearsDays[idx,2]
endday <- YearsDays[idx,3]
BC_rain.slice <- Biased_corrected.array[,,startday:endday]
assign(paste(year, "_Annual_rain"),apply(BC_rain.slice, c(1,2), sum))
annual_rain <- apply(BC_rain.slice, c(1,2), sum)

#save data in a raster
assign(paste(year, "_rain_r"),raster(t(annual_rain), xmn=min(x), xmx=max(x), ymn=min(y), ymx=max(y), crs=WGS84))

}

您不能使用paste来创建您所列出的变量名。您可以将其包含在assigneval中,但是将结果存储在数据帧中可能更容易。下面是我认为你正在努力实现的一个例子。我还将while循环和计数器替换为for循环迭代数年:

YearsDays <- read.csv("Data\Years.csv") # a df with 49 obs. of 3 variables (year, start day, and end day
output <- data.frame(year = YearsDays[,1], rain_r = NA)
for (idx in seq(nrow(YearsDays))){

#set variables to loop through
year <- YearsDays[idx,1]
startday <- YearsDays[idx,2]
endday <- YearsDays[idx,3]

BC_rain.slice <- Biased_corrected.array[,,startday:endday]
annual_rain <- apply(BC_rain.slice, c(1,2), sum)

#save data in a raster
output$rain_r[output$year == year] <- raster(t(annual_rain, xmn=min(x), xmx=max(x), ymn=min(y), ymx=max(y), crs=WGS84))
}

换掉你的零件怎么样

paste(year, "_Annual_rain") <- apply(BC_rain.slice, c(1,2), sum)

#save data in a raster
paste(year, "_rain_r") <- raster(t(paste(year, "_Annual_Rain"), xmn=min(x), xmx=max(x), ymn=min(y), ymx=max(y), crs=WGS84)

txt <- paste0(year, "_Annual_rain <- apply(BC_rain.slice, c(1,2), sum)")
eval(parse(text = txt))
# save data in a raster
txt <- paste0(year, "_rain_r <- raster(t(", year, "_Annual_Rain), xmn=min(x), xmx=max(x), ymn=min(y), ymx=max(y), crs=WGS84)")
eval(parse(text = txt))

最新更新