2015-10-05 105 views
1

我正在嘗試創建一個密度相關的Leslie矩陣工具,該工具將給定時間的總人口循環回公式並調整生存率和/或出生率(即,Leslie矩陣)進行下一次迭代(直到給定的終點)。下面的代碼被嵌入到更大的函數中,但是我可以看到這部分中有些東西被破壞了。請注意,爲了簡潔起見,我只提取了相關的代碼,並檢查了它在大函數中的表現。使用條件ifelse函數分配矩陣結果爲0值

當我運行下面的代碼而不是返回矩陣的條件ifelse函數時,它返回0.變量L.new應該等於示例中的4 x 4矩陣L

我怎樣才能得到條件返回一個矩陣,爲什麼這個代碼返回0而不是矩陣?

b.r <- c(0, 1, 5, 0) 

surv.rates <- rbind( 
    age1 = c(0.3, 0.0, 0.0, 0.0), 
    age2 = c(0.0, 0.6, 0.0, 0.0), 
    age3 = c(0.0, 0.0, 0.8, 0.0)) 

surv.rates2 <- rbind(  
    age1 = c(0.3/2, 0.0, 0.0, 0.0), 
    age2 = c(0.0, 0.6/2, 0.0, 0.0), 
    age3 = c(0.0, 0.0, 0.8/2, 0.0)) 

surv.rates3 <- rbind(  
    age1 = c(0.3/4, 0.0, 0.0, 0.0), 
    age2 = c(0.0, 0.6/4, 0.0, 0.0), 
    age3 = c(0.0, 0.0, 0.8/4, 0.0)) 

L <- rbind(births = b.r, surv.rates) 
L2 <- rbind(births = b.r, surv.rates2) 
L3 <- rbind(births = b.r, surv.rates3) 


t1 <- 10 
t2 <- 100 

L.new <- ifelse(1 > t2, yes = L3, 
       no = ifelse(1 > t1, yes = L2, 
          no = L)) 
L.new # should equal matrix `L` 

FYI版本信息:

platform  x86_64-w64-mingw32   
arch   x86_64      
os    mingw32      
system   x86_64, mingw32    
status          
major   3       
minor   2.2       
year   2015       
month   08       
day   14       
svn rev  69053      
language  R       
version.string R version 3.2.2 (2015-08-14) 
nickname  Fire Safety 

回答

2

ifelse被矢量,所以挑選出的yes/no選擇的相應元件(即,第一元件,由於test具有長度爲1)。也許這會工作?

L.new <- if (1 > t2) L3 else if (1>t1) L2 else L 

或者更理解地:

if (1>t2) { 
    L.new <- L3 
} else if (1>t1) { 
    L.new <- L2 
} else L.new <- L 

?ifelse

還應注意, '如果(測試)是別人沒有' 是更有效 ,往往更優選地將'ifelse(test,yes,no)' 'test'是一個簡單的真/假結果,即'length(test)== 1'。

+0

太棒了!謝謝博爾克先生。這兩種方法都有效。奇怪的是,'ifelse'做了任何強制,因爲你確切地告訴它要分配什麼......從現在開始,我可能只會依賴'if'和'else'。 – churchb33

+1

我不知道這是一種強制,而是一個矩陣只是一個具有維度的向量。由於'ifelse'是矢量化的,它只需要像ifelse(1> 2,yes = matrix(1:3),no = matrix(3:1))這樣的vector/matrix的第一個值。一個可能會很棘手,並使函數返回一個列表中的矩陣,如:'ifelse(1> 2,yes = list(matrix(1:3)),no = list(matrix(3:1)))''。然後'if'然後'else'仍然是可取的。 – thelatemail