我正在处理时间序列的栅格,我需要分析17个日期的ts。对于每个日期,我导入了5频段和7频段。我列出了17个频段-5和17个频段-7的列表,分别称为list_B5和list_B7。 我想将相同日期的波段叠加在一起,所以:list_B5的第一个栅格,其中第一个栅格为list_B7; list_B5的第二个栅格,其中第二个栅格为list_B7;等等。
我是循环的新手,但我试着写一个:
for (i in seq_along(length(list_B5)) [1]) {
for (j in seq_along(length(list_B7)) [2]) {
B5 <- raster(list_B5[[i]]) #extract the raster of interest
B7 <- raster(list_B7[[j]]) #extract the raster of interest
test[i,j] <- brick(B5, B7) #stack them together
}
}
以“test”为:
test <- brick(nrows=5490, ncol=5490, nl=17)
不幸的是我收到以下错误:
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘raster’ for signature ‘"NULL"’
我不明白为什么它不接受我尝试提取感兴趣的栅格的行,因为这条线通常可以工作:
> raster(list_B5[[3]])
class : RasterLayer
dimensions : 5490, 5490, 30140100 (nrow, ncol, ncell)
resolution : 20, 20 (x, y)
extent : 6e+05, 709800, 5590200, 5700000 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=31 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
有人可以向我解释为什么我会收到上述错误吗?
答案 0 :(得分:1)
seq_along(length(list_B5))
没有按照您的预期行事。相反,它只返回1
。您需要使用seq_along(list_B5)
或seq_len(length(list_B5))
。查看文档以获取信息。
稍后,您将1
分组到其第二个元素:seq_along(length(list_B7))[2]
。这会引入NA
,这会在以后导致问题。
您可以自行调试这些问题,方法是测试部分代码以查看它们是否产生预期结果。例如,运行seq_along(length(list_B5))[1]
和seq_along(length(list_B7))[2]
,看看它们是否生成了您希望的序列。
使用mapply
执行此操作可能最简单。
list_b5 <- replicate(17, raster(matrix(runif(12), ncol=3)))
list_b7 <- replicate(17, raster(matrix(runif(12), ncol=3)))
mapply(stack, list_b5, list_b7)
此处mapply
同时循环list_b5
和list_b7
的元素,并应用stack
函数(如果您愿意,请替换为brick
。)< / p>
如果您的列表实际上是文件路径,那么您可以执行以下操作:
list_b5 <- replicate(17, raster(matrix(runif(12), ncol=3)))
list_b7 <- replicate(17, raster(matrix(runif(12), ncol=3)))
mapply(function(x, y) stack(raster(x), raster(y)), list_b5, list_b7)
以下是使用for
循环执行此操作的方法:
test <- list(length=17)
for (i in seq_along(list_b5)) {
b5 <- list_b5[[i]]
b7 <- list_b7[[i]]
test[[i]] <- stack(b5, b7)
}
或者如果您的列表是文件路径,
test <- list(length=17)
for (i in seq_along(list_b5)) {
b5 <- raster(list_b5[[i]])
b7 <- raster(list_b7[[i]])
test[[i]] <- stack(b5, b7)
}