【问题标题】:Stacking the climate data downloaded from PRISM in R在 R 中堆叠从 PRISM 下载的气候数据
【发布时间】:2015-02-10 12:18:18
【问题描述】:

我下载了几年的 prism 气候数据,我希望我能就如何堆叠每一年的这些数据获得一些建议。因此,下载并解压后,每个月的数据都在不同的文件夹中。我需要堆叠每年的月度数据。我是 R 的新手,如果我能就如何实现这一点得到一些建议,我将不胜感激。文件夹名称如下: PRISM_ppt_stable_4kmM2_201312_bil PRISM_ppt_stable_4kmM2_201311_bil PRISM_ppt_stable_4kmM2_201310_bil 等

【问题讨论】:

  • 您是否使用 raster 包阅读它们?您只需要构建一个堆栈或砖块对象...

标签: r


【解决方案1】:

以下是@Amstell 脚本的变体。它不使用单独的 RasterLayer 对象,因此更容易维护,更通用,因为s 可以有任意数量的层。我想我会在循环外运行一次 list.files,然后在循环内使用 grep 来获取子集。

    library(raster)
    setwd("./Prism Weather Data All/1895-2014_BIL/ppt")   
    years <- 1900:1900
    for (i in years) {
      filenames <- list.files(pattern=paste(".*_",i,".*\\.bil$", sep = ""))
      s <- stack(filenames)
      y <- data.frame(rasterToPoints(s))
      colnames(y) <- c("lon", "lat", month.abb)
      y$year <- i
      y$gridNumber <- cellFromXY(s, y[, 1:2])
      # write.csv( ) ?
    }

还要注意.../ 是没有意义的。当前目录使用./(或不使用),父目录使用../(以此类推../../

【讨论】:

  • 谢谢你。它效率更高;我不知道stack() 函数,它似乎非常适合这种情况。谢谢!
【解决方案2】:

我从该站点获得了处理 PRISM 数据的很多帮助,我将一些代码传递给您,以使这更容易。以下代码将从栅格文件中提取信息,并将其放入您想要的每一年的一个不错的 data.frame 中。

设置

在它运行之前设置一些东西是非常重要的。

  1. 将您需要的所有年份的所有 *.bil 和 *.hdr 文件提取到特定目录中
  2. setwd() 被分配给带有 *.bil 和 *.hdr 文件的目录
  3. path &lt;- ".../" 包含导出路径,如果您想将年份导出到 *.csv 文件中——如果您愿意的话
  4. startingyear 和 endyear 分配给您要提取的任何年份
  5. filenames &lt;- 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")
}

结果

【讨论】:

  • 设置正确但代码不是很好。例如。使用s &lt;- stack(filenames)as.data.frame(s) 而不是逐层遍历
  • 这仍然是一个糟糕的例子。您可以用正确的方式将x = 1:3sum(x) 和错误的方式相加:x[1] + x[2] + x[3]。重要的是要指出,否则其他初学者可能会效仿你的坏榜样。
  • @RobertH 我非常感谢您的 cmets。你愿意/能够告诉我你会在我的例子中改变什么吗?谢谢。
  • 我已在单独的答案中添加了这一点。
【解决方案3】:

数据的文件格式是什么? 是csv还是一些文本? 如果是 csv 你可以在 R 中使用 read.csv 函数,它会为你创建一个整洁的 data.frame 对象。

您可以为每年创建一些迭代器以从每个文件夹中读取数据,例如:

year = 2010:2014
months = 1:12
folder_names = sapply(year, function(y) { sapply(month, function(m){ 
                    paste(
                        paste(
                              paste("PRISM_ppt_stable_4kmM2_", y, sep=""), 
                               m, sep=""),
                          "_bil", sep="") }) })

这样,您就生成了所有目录名称。

现在您可以从它们中读取,但为此我们需要知道您保存数据的文件。

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
  • 好的,抱歉我不知道,谢谢你的澄清。
  • 你的答案现在很好,因为你已经充实了。
【解决方案4】:

用类似的东西获取文件名

 f <- list.files(pattern='.bil$', recursive=TRUE, full=TRUE)

也许您需要订购它们。然后做

 s <- stack(f)

然后对堆栈做任何你想做的事情(你没有指定)。要获得值和单元格中心的矩阵,您可以这样做

 v <- rasterToPoints(s)

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 2020-10-15
    • 2013-12-29
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2021-12-31
    相关资源
    最近更新 更多