我从该站点获得了处理 PRISM 数据的很多帮助,我将一些代码传递给您,以使这更容易。以下代码将从栅格文件中提取信息,并将其放入您想要的每一年的一个不错的 data.frame 中。
设置
在它运行之前设置一些东西是非常重要的。
- 将您需要的所有年份的所有 *.bil 和 *.hdr 文件提取到特定目录中
-
setwd() 被分配给带有 *.bil 和 *.hdr 文件的目录
-
path <- ".../" 包含导出路径,如果您想将年份导出到 *.csv 文件中——如果您愿意的话
- startingyear 和 endyear 分配给您要提取的任何年份
-
filenames <- list.files(path = ".../" 分配给带有 *.bil 和 *.hdr 文件的目录。这应该与setwd() 相同
代码
library(plyr)
library(dplyr)
library(raster)
library(rgdal)
library(tidyr)
library(reshape2)
library(data.table)
### Precipitation (ppt) ###
# !!!!! Set to directory with *.hdr and *.bil only
setwd(".../Prism Weather Data All/1895-2014_BIL/ppt/")
# Path to write out (if necessary)
path <- ".../Prism Weather Data All/csv/ppt/")
# Set years to process
startingyear <- 1900
endingyear <- 1900
total <- startingyear:endingyear
for (i in total) {
year <- as.character(i)
# Make sure to set the correct path where *.hdr and *.bil are
filenames <- list.files(path = ".../Prism Weather Data All/1895-2014_BIL/ppt/",
pattern = paste(".*_", year, ".*\\.bil", sep = ""))
# Assign raster file to object
r1 = raster(filenames[1])
r2 = raster(filenames[2])
r3 = raster(filenames[3])
r4 = raster(filenames[4])
r5 = raster(filenames[5])
r6 = raster(filenames[6])
r7 = raster(filenames[7])
r8 = raster(filenames[8])
r9 = raster(filenames[9])
r10 = raster(filenames[10])
r11 = raster(filenames[11])
r12 = raster(filenames[12])
# Assign values from raster file to month object
jan <- as.data.frame(r1, na.rm = TRUE)
feb <- as.data.frame(r2, na.rm = TRUE)
mar <- as.data.frame(r3, na.rm = TRUE)
apr <- as.data.frame(r4, na.rm = TRUE)
may <- as.data.frame(r5, na.rm = TRUE)
jun <- as.data.frame(r6, na.rm = TRUE)
jul <- as.data.frame(r7, na.rm = TRUE)
aug <- as.data.frame(r8, na.rm = TRUE)
sep <- as.data.frame(r9, na.rm = TRUE)
oct <- as.data.frame(r10, na.rm = TRUE)
nov <- as.data.frame(r11, na.rm = TRUE)
dec <- as.data.frame(r12, na.rm = TRUE)
# Bind all gridnumbers with monthly data to object
jan <- cbind(gridNumber = rownames(jan), jan, stringsAsFactors = FALSE)
feb <- cbind(gridNumber = rownames(feb), feb, stringsAsFactors = FALSE)
mar <- cbind(gridNumber = rownames(mar), mar, stringsAsFactors = FALSE)
apr <- cbind(gridNumber = rownames(apr), apr, stringsAsFactors = FALSE)
may <- cbind(gridNumber = rownames(may), may, stringsAsFactors = FALSE)
jun <- cbind(gridNumber = rownames(jun), jun, stringsAsFactors = FALSE)
jul <- cbind(gridNumber = rownames(jul), jul, stringsAsFactors = FALSE)
aug <- cbind(gridNumber = rownames(aug), aug, stringsAsFactors = FALSE)
sep <- cbind(gridNumber = rownames(sep), sep, stringsAsFactors = FALSE)
oct <- cbind(gridNumber = rownames(oct), oct, stringsAsFactors = FALSE)
nov <- cbind(gridNumber = rownames(nov), nov, stringsAsFactors = FALSE)
dec <- cbind(gridNumber = rownames(dec), dec, stringsAsFactors = FALSE)
# Merge Monthly data
month_list <- lapply(list(jan,feb,mar, apr, may, jun, jul, aug, sep, oct, nov, dec),setDT)
for(j in seq_along(month_list)){
set(month_list[[j]],j="ID",value = names(month_list[[j]])[2])
setnames(month_list[[j]], names(month_list[[j]])[2], "value")
}
# Faster processing of aggregated data
long_data <- rbindlist(month_list)
wide <- dcast.data.table(long_data, gridNumber~ID, value = 'value')
wide$year <- year
colnames(wide) <- c("gridNumber", "jan","feb","mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", "year")
}
结果