使用条件ifelse函数分配矩阵会产生0值

时间:2015-10-05 22:07:19

标签: r if-statement matrix conditional

我正在尝试创建一个密度相关的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 

1 个答案:

答案 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’ 。