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
太棒了!謝謝博爾克先生。這兩種方法都有效。奇怪的是,'ifelse'做了任何強制,因爲你確切地告訴它要分配什麼......從現在開始,我可能只會依賴'if'和'else'。 – churchb33
我不知道這是一種強制,而是一個矩陣只是一個具有維度的向量。由於'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