【发布时间】:2019-11-07 17:34:08
【问题描述】:
我有一个尺寸为 32251*51333 的大型栅格数据 (X)。 X 的值是另一个数组 (Y) 的重复,其大小为 3*10^6。 现在我想通过将 X 的值与 Y 的每个值进行匹配来更改 X 的值,例如我可以这样编程,
for (i in 1:length(Y)){
X[X==Y[i]] = Z[i] #Z is just another array with the same size as Y
}
问题在于,首先匹配X[X==Y[i]] = Z[i] 的索引不起作用,因为X 太大。几分钟后程序停止并给出错误"Error: cannot allocate vector of size 6.2 Gb".
其次,从 1 到长度(Y)的循环,即使 Y 的大小为 10^6,也可能需要“永远”才能完成。
我想到的一种方法是将 X 分成小块,然后为每个块进行索引匹配。但我觉得这仍然需要很多时间。
有没有更好的方法来实现上述目标?
第一次更新:
感谢@Lyngbakr 提供的示例,我将进一步阐述这个问题。因为我正在使用的栅格非常大(32251*51333),所以似乎无法上传。 @Lyngbakr 给出的示例与我想要的非常相似,只是创建的栅格太小。现在按照这个例子,我通过生成一个尺寸为 3000*2700 的更大的栅格来运行两个测试。请参阅下面的代码。
#Method 1: Use subs
start_time <- Sys.time()
Y <- 1:9
Z <- 91:99
X <- raster(matrix(rep(Y, 3), nrow=3000,ncol = 2700))
df <- data.frame(Y, Z)
X <- subs(X, df)
end_time <- Sys.time()
end_time - start_time
#Time difference of 2.248908 mins
#Method 2: Use for loop
start_time <- Sys.time()
Y <- 1:9
Z <- 91:99
X <- raster(matrix(rep(Y, 3), nrow=3000,ncol = 2700))
for (i in 1:length(Y)){
X[X==Y[i]]=Z[i] #this indexing of R seems not efficient if X becomes large
}
end_time <- Sys.time()
end_time - start_time
#Time difference of 10.22717 secs
如您所见,一个简单的 for 循环甚至比 subs 函数更有效。请记住,示例中显示的栅格仍然小于我使用的栅格(大约小 100 个数量级)。此外,示例中的数组 Y 非常小。现在的问题可能是,如何加快方法 2,这只是一个简单的 for 循环?
【问题讨论】:
-
我们需要每个光栅对象的一个小例子。首先使用
library调用加载任何需要的包,然后制作小示例并说明预期结果。
标签: r matrix indexing raster large-data