2015-04-04 41 views
0

我有栅格图像,我想应用一个函数,它会给出一个基于相邻单元值的值。在一个以该单元格为中心的3x3窗口中,我想根据多少个单元格(来自该窗口中的其他8个单元格)为单元格赋予一个介于0和8/8(= 1)之间的值。例如,如果其他5个单元格的值与中央单元格的值不同,则该函数必须在该单元格中分配5/8。 我正在试图使用光栅包的焦点。R:使用栅格包的函数中的错误

首先,我写处理3×3窗口的函数:

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 < -focal(R,W =矩阵(1,3 ,3),趣味=混合(W))

,但:“在混合(W)错误:对象‘v’找不到”

我认为我失去了一些东西,也许是方法不正确。

任何帮助将不胜感激。

在此先感谢 约翰

+1

也许分配'v == 0'应该是'v < - 0'与''== – bergant 2015-04-04 18:46:06

+0

也许结肠运营商在R不符合您的期望比较。见'?“:”' – bergant 2015-04-04 18:56:04

+0

谢谢。 v <-o解决错误。艾尔认为,我仍然有一个问题。在r2 <-focal(r,w =矩阵(1,3,3),fun = mix(w))中,w在混合(w)中不被识别。我期望这样的事情,因为你真的把一个功能,输入不是W,但所有的数字从3X3窗口。我无法想象我将如何将其作为矩阵来引用。 – user3052581 2015-04-04 20:15:57

回答

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 
} 

现在的混合功能工作正常。 使用焦点制作示例似乎焦点使用应用窗口中的数字向量。所以它应该可以正常工作。我还测试了一个10×10的光栅,工作正常

我把它标记为已回答。

有一个愉快的一天

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) 
} 
+0

你真的不需要'ifelse'这里,因为TRUE被转换为1并且FALSE为0如果你在像sum ,意思是,...所以你可以做'意思是(a!= b&a!= 0,na.rm = na.rm)' – Dason 2015-04-06 16:03:45

1

这是一个坏的功能,难以阅读,和低效。 Bergant展示了一个更好的选择,这是另一个变化。

mix2 <- function(a, ...){ 
    i <- a[5] != a 
    mean(i[-5], na.rm=TRUE) 
}