2015-04-04 95 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) 
} 
相關問題