我正在尝试找到一个apply()类型函数,该函数可以运行一个在两个数组而不是一个数组上运行的函数。
类似:
apply(X1 = doy_stack, X2 = snow_stack, MARGIN = 2, FUN = r_part(a, b))
数据是来自Landsat磁贴的一组波段阵列,使用rbind堆叠在一起。每行包含来自单个磁贴的数据,最后,我需要在此堆栈中的每个数据列(像素)上应用一个函数。一个这样的堆栈包含每个像素是否有雪,而另一个堆栈包含该行的一年中的某一天。我想在每个像素上运行一个分类器(rpart),让它识别每个像素的无雪日。
我现在正在做的事情非常愚蠢:mapply(paste, doy, snow_free)
将每个像素的日期和雪状态连在一起作为字符串,apply(strstack, 2, FUN)
在每个像素上运行分类,并在应用函数,我使用strsplit
爆炸每个字符串。正如您可能想象的那样,效率非常低,特别是在100万像素×300个瓷砖上。
谢谢!
答案 0 :(得分:9)
我不会试图过于花哨。你可能只需要一个for循环。
out <- numeric(n)
for(i in 1:n) {
out[i] <- snow_free(doy_stack[,i], snow_stack[,i])
}
或者,如果您不想自己做簿记,
sapply(1:n, function(i) snow_free(doy_stack[,i], snow_stack[,i]))
答案 1 :(得分:2)
我刚刚遇到同样的问题,如果我清楚地理解了这个问题,我可能已经使用mapply
解决了这个问题。
我们将使用两个填充了均匀随机值的10x10矩阵。
set.seed(1)
X <- matrix(runif(100), 10, 10)
set.seed(2)
Y <- matrix(runif(100), 10, 10)
接下来,确定如何执行矩阵之间的操作。如果是行,则需要转置X和Y,然后转换为data.frame
。这是因为data.frame
是list
,列为列表元素。 mapply()
假设您传递的是list
。在这个例子中,我将逐行执行相关。
res.row <- mapply(function(x, y){cor(x, y)}, as.data.frame(t(X)), as.data.frame(t(Y)))
res.row[1]
V1
0.36788
应与
相同cor(X[1,], Y[1,])
[1] 0.36788
对于按列操作,请排除t()
:
res.col <- mapply(function(x, y){cor(x, y)}, as.data.frame(X), as.data.frame(Y))
这显然假设X
和Y
具有与感兴趣的操作一致的尺寸(即,它们不必具有完全相同的尺寸)。例如,可能需要逐行进行统计测试,但每个矩阵中的列数不同。
答案 2 :(得分:1)
将它实现为栅格堆栈不是更自然吗?使用raster
包,您可以在函数中使用整个栅格(例如ras3 <- ras1^2 + ras2
),以及从XY坐标提取单个单元格值,或使用块或多边形蒙版提取多个单元格值。
答案 3 :(得分:-1)
apply
可以处理更高维度(即list
元素)。不确定您的数据是如何设置的,但是您可能正在寻找这样的内容:
apply(list(doy_stack, snow_stack), c(1,2), function(x) r_part(x[1], x[2]))