我有光栅图像,我想应用一个函数,该函数将根据相邻单元格值给出一个值。在该单元格中心的3x3窗口中,我希望为单元格提供0到8/8(= 1)之间的值,具体取决于有多少单元格(来自该窗口中的其他8个单元格)。例如,如果其他5个单元格的值与中心单元格不同,则该函数必须在该单元格中分配5/8。 我试图使用光栅包中的焦点来做到这一点。
首先,我编写了一个处理3x3窗口的函数:
mix<-function(a, na.rm=TRUE){
v==0
b=a[2:2]
if (!(a[1:1]=b)) {
if (!is.na(a[1:1])){v=v+1}else v=v
}
if(!(a[1:2]=b)){if (!is.na(a[1:2])){v=v+1}else v=v}
if(!(a[1:3]=b)){if (!is.na(a[1:3])){v=v+1}else v=v}
if(!(a[2:1]=b)){if (!is.na(a[2:1])){v=v+1}else v=v}
if(!(a[2:3]=b)){if (!is.na(a[2:3])){v=v+1}else v=v}
if(!(a[3:1]=b)){if (!is.na(a[3:1])){v=v+1}else v=v}
if(!(a[3:2]=b)){if (!is.na(a[3:2])){v=v+1}else v=v}
if(!(a[3:1]=b)){if (!is.na(a[3:3])){v=v+1}else v=v}
v
}
然后我尝试使用这样的焦点:
r2&lt; -focal(r,w = matrix(1,3,3),fun = mix(w))
但是:“混合错误(w):未找到对象'v'”
我认为我遗漏了一些东西,也许方法不正确。
任何帮助将不胜感激。
先谢谢 约翰
答案 0 :(得分:1)
这是一个糟糕的功能,难以阅读,效率低下。 Bergant显示了一个更好的选择,这是另一种变体。
mix2 <- function(a, ...){
i <- a[5] != a
mean(i[-5], na.rm=TRUE)
}
答案 1 :(得分:0)
我终于解决了我的问题 我纠正了混合函数:
mix<-function(a, na.rm=TRUE){
v<-0
b=a[5]
if (!(a[1]==b)) {if (!(a[1]==0)){v=v+1}else v=v}
if(!(a[2]==b)){if (!(a[2]==0)){v=v+1}else v=v}
if(!(a[3]==b)){if (!(a[3]==0)){v=v+1}else v=v}
if(!(a[4]==b)){if (!(a[4])==0){v=v+1}else v=v}
if(!(a[6]==b)){if (!(a[6])==0){v=v+1}else v=v}
if(!(a[7]==b)){if (!(a[7])==0){v=v+1}else v=v}
if(!(a[8]==b)){if (!(a[8])==0){v=v+1}else v=v}
if(!(a[9]==b)){if (!(a[9])==0){v=v+1}else v=v}
v/8
}
现在混音功能正常。 使用焦点制作示例似乎焦点使用应用窗口中的数字向量。所以它应该工作正常。我还测试了一个10x10的光栅并且工作正常
我将其标记为已回答。
度过愉快的一天
答案 2 :(得分:0)
在R中,您可以对矢量执行基本操作:
mix2<-function(a, na.rm = TRUE){
b <- a[5]
a <- a[-5]
mean(ifelse(a != b & a != 0, 1, 0), na.rm = na.rm)
}