我有几个目录,里面都是每日的气候数据。我需要将每日栅格合并为每周栅格,一些是通过值的总和,一些是通过值的平均值。到目前为止,我已经在目录(其中包含每日光栅文件)中创建了一个文件名向量,并为编写了一个循环来导入前7个光栅,将光栅放入一个
堆栈
,使用计算
将堆栈
中光栅的平均值(或总和)写入一个新光栅,并将光栅写入工作目录中的一个文件。然后,我尝试从向量中删除前7个名称,并对向量中剩余的前7个文件名重复循环,从而处理新的文件名向量。我遇到的问题是,没有从向量中删除第一个索引文件名。这是密码。
#file names for rasters are in a column of data frame
fname <- (repDf$fname)
#get rid of first 5 values to start on Sunday
fname <- fname[-c(1:5)]
#look at beginning of fname vector
head(fname)
[1] "1980_6.asc" "1980_7.asc" "1980_8.asc" "1980_9.asc" "1980_10.asc" "1980_11.asc"
for (i in seq_along(fname)){
f1 <- fname[[i]]
f2 <- fname[[i+1]]
f3 <- fname[[i+2]]
f4 <- fname[[i+3]]
f5 <- fname[[i+4]]
f6 <- fname[[i+5]]
f7 <- fname[[i+6]]
r1 <- raster(f1)
r2 <- raster(f2)
r3 <- raster(f3)
r4 <- raster(f4)
r5 <- raster(f5)
r6 <- raster(f6)
r7 <- raster(f7)
s <- stack(r1,r2,r3,r4,r5,r6,r7)
r <- calc(s, fun=sum)
r <- r * 0.0393701
r <- round(r, 2)
writeRaster(x=r, filename=paste0("week_", i, sep=""), format="ascii", overwrite=TRUE)
remove <- c(f1,f2,f3,f4,f5,f6,f7)
fname <- fname[! fname %in% remove]
}
#Example RasterLayer (after loop has run twice)
print(r1)
class : RasterLayer
dimensions : 227, 199, 45173 (nrow, ncol, ncell)
resolution : 994.9749, 994.9749 (x, y)
extent : 367500, 565500, -1325500, -1099641 (xmin, xmax, ymin, ymax)
coord. ref. : NA
data source : G:\dailyPrism\10843\prcp\1980_30.asc
names : X1980_30
#Example indexed file names (after loop has run twice)
f1
[1] "1980_30.asc"
#Example output raster (after loop has run twice)
print(r)
class : RasterLayer
dimensions : 227, 199, 45173 (nrow, ncol, ncell)
resolution : 994.9749, 994.9749 (x, y)
extent : 367500, 565500, -1325500, -1099641 (xmin, xmax, ymin, ymax)
coord. ref. : NA
data source : in memory
names : layer
values : 1.02, 3.54 (min, max)
The problem can be seen here;
head(fname)
[1] "1980_13.asc" "1980_21.asc" "1980_29.asc" "1980_30.asc" "1980_31.asc" "1980_32.asc"
出于某种原因,将用作一周第一天的文件名保留在fname向量中,并且进入每周计算的文件不代表它们需要的天数。非常感谢任何帮助。我会尝试提供一些示例文件来使用,但文件相当大。
下面是如何通过从文件名向量创建RasterStack,使代码更加简洁
fname <- repDf$fname[-c(1:5)]
for (i in seq(1,length(fname), by=7)){
s <- stack(fname[i:(i+6)])
r <- sum(s) * 0.0393701
r <- round(r, 2)
writeRaster(r, filename=paste0("week_", i), format="ascii", overwrite=TRUE)
}
在您的代码中添加一些调试代码,您可以识别发生了什么(我已经禁用了处理部分,因为我没有文件或计算逻辑):
fname <- c(paste0("1980_", 6:40, ".asc"))
fname[1]
seq_along(fname) # vector from 1 to length of vector!!!
for (i in seq_along(fname)){
print(i)
print(paste("Size of fname:", length(fname)))
print(head(fname))
print(fname[i])
f1 <- fname[[i]]
f2 <- fname[[i+1]]
f3 <- fname[[i+2]]
f4 <- fname[[i+3]]
f5 <- fname[[i+4]]
f6 <- fname[[i+5]]
f7 <- fname[[i+6]]
# r1 <- raster(f1)
# r2 <- raster(f2)
# r3 <- raster(f3)
# r4 <- raster(f4)
# r5 <- raster(f5)
# r6 <- raster(f6)
# r7 <- raster(f7)
# s <- stack(r1,r2,r3,r4,r5,r6,r7)
# r <- calc(s, fun=sum)
# r <- r * 0.0393701
# r <- round(r, 2)
# writeRaster(x=r, filename=paste0("week_", i, sep=""), format="ascii", overwrite=TRUE)
remove <- c(f1,f2,f3,f4,f5,f6,f7)
fname <- fname[! fname %in% remove]
}
这将导致:
[1] 1
[1] "Size of fname: 35"
[1] "1980_6.asc" "1980_7.asc" "1980_8.asc" "1980_9.asc" "1980_10.asc" "1980_11.asc"
[1] 2
[1] "Size of fname: 28"
[1] "1980_13.asc" "1980_14.asc" "1980_15.asc" "1980_16.asc" "1980_17.asc" "1980_18.asc"
[1] 3
[1] "Size of fname: 21"
[1] "1980_13.asc" "1980_21.asc" "1980_22.asc" "1980_23.asc" "1980_24.asc" "1980_25.asc"
[1] 4
[1] "Size of fname: 14"
[1] "1980_13.asc" "1980_21.asc" "1980_29.asc" "1980_30.asc" "1980_31.asc" "1980_32.asc"
[1] 5
[1] "Size of fname: 7"
[1] "1980_13.asc" "1980_21.asc" "1980_29.asc" "1980_37.asc" "1980_38.asc" "1980_39.asc"
Error in fname[[i + 3]] : subscript out of bounds
原因是您循环了预定义数量的fname向量项(“在我的示例中,seq_-along”=35)。
而且puh,代码还有很大的改进空间(例如。不需要删除元素,只需遍历向量元素;如何在最后一个循环中处理错误的向量大小;为什么使用双方括号访问fname...)
易于修改以解决问题(无需优化代码):
修改循环:
for (i in seq(1,length(fname), by=7)) {
删除两行:
remove <- c(f1,f2,f3,f4,f5,f6,f7)
fname <- fname[! fname %in% remove]
并添加调试输出:
print( paste("processing files", f1, "to", f7))
下面的代码在我的图像上生成两个框。我正计划进一步分析这些框内的像素。 在下面的例子中,在红色方块的情况下,我不想继续下去,因为它的右上角有黑色像素。而我想继续在绿色方块的情况下,因为它没有一个黑色像素沿着它的边缘。
我有50多个需要裁剪的光栅文件(ASCII格式)。我已经以ASCII格式从ArcMap导出了遮罩,并将其加载到R中。如何使其适用于一行中的所有光栅,并以与之前相同的名称导出它们(当然是在不同的文件夹中,以避免覆盖)? 我知道光栅软件包中有裁剪功能,但到目前为止我从未使用过。我只是把它们堆放起来做进一步的栖息地分析。 到目前为止,我的代码:
问题内容: 我正在尝试拍摄图像并将其存储在16x16子图像数组中。我使用的图像是512x512像素。但是,在遍历循环时,getSubimage()被Raster异常停止。 这是代码: 这是错误: 问题答案: 您将错误的参数传递给。文档说… 参数: x-指定矩形区域的 左上角的X坐标y- 指定矩形区域的左上角的Y坐标 w- 指定矩形区域的宽度 h-指定高度矩形区域 您正在传递,这意味着如果= 256
我有许多不重叠的点形状文件,我想把它们归因于analagous光栅,也不重叠。我想用光栅数据来确定这些点的属性。对于我正在使用的一些光栅数据类型,我能够先合并光栅,然后合并属性。但是,我的最后几组光栅数据没有相同的原点,因此我无法合并/拼接它们。我试图在不合并光栅的情况下,将点归因于光栅。这需要我在特定的空间点-光栅对上使用extract()。我用一个唯一的4个字母的名称为每个空间点文件命名,这也
我把我的问题简化了一点,希望它有意义。 我有三个栅格,我正在使用。 栅格是一个栅格,其土地覆盖属性值1为本地土地覆盖,0为非本地土地覆盖。 本地蒸散量和非本地蒸散量分别是本地物种和非本地物种的蒸散量。两个光栅的属性都在[015000]之间 id要做的是将1的所有值替换为nativeet值,将0的所有值替换为nonnativeet值。 我的想法是将土地覆盖光栅(值为1或0)转换为AET光栅(值介于0
我正在尝试在R中设置一个randomForest,以便根据其他光栅图像对光栅图像进行分类。我的训练数据是一个完全填充的光栅图像,我想训练许多其他光栅,以尝试基于初始光栅创建光栅输出。代码示例如下: <代码>rf1 ...其中,是我的光栅格式的实际已知值,而到是我想用来预测trainingRaster1是什么的其他光栅图像。我知道您将使用向量或点的训练类来训练一系列光栅,但在我的情况下,我希望使用光