我正在尝试创建一个密度相关的Leslie矩阵工具,它将给定时间的总人口循环回公式,并调整下一次迭代的生存率和/或出生率(即Leslie矩阵)(向上)到一个给定的终点)。下面的代码嵌入在较大的函数中,但我可以看到这部分中存在一些问题。请注意,为了简洁起见,我仅提取了相关代码,并检查它是否与大函数中的行为相同。
当我运行下面的代码时,而不是返回矩阵的条件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
答案 0 :(得分: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'是一个简单的真/假结果,即当'length(test)==时 1’ 。