试图编写一个包含Modify_if的通用函数

问题描述 投票:0回答:1

我正在编写种群的微观模拟。每个生物可以处于四个阶段的任何一个阶段,并且在每个阶段都有可能死亡。我想编写一个通用函数,或者使用一条apply语句评估向量的每个元素,拉出阶段级别(1-4),然后计算该特定个体是否死亡,从而进入状态0。是我的实力。

library(tidyverse)
p1 <- 0.50
p2 <- 0.45
p3 <- 0.65
p4 <- 0.55

## create initial population
status <- as.numeric(sample(1:4, 10, replace = TRUE))
status
## check each stage and modify accordingly if that individual dies
status %<>% modify_if(~ .x == 4, ~rbinom(1, 1, p4) * 4)
status
status %<>% modify_if(~ .x == 3, ~rbinom(1, 1, p3) * 3)
status
status %<>% modify_if(~ .x == 2, ~rbinom(1, 1, p2) * 2)
status
status %<>% modify_if(~ .x == 1, ~rbinom(1, 1, p1) * 1)
status

现在,如果分别在每个阶段执行计算,则这样做会起作用,但是尝试生成通用函数版本会失败。困难的另一部分是获得函数以独立评估数组的每个元素。举例来说,我不希望将4的所有值都转换为0,而只是选择其中的一个,即希望对数组中4的每个实例执行rbinom评估。

died <- function (vec, day) {
    vec %<>% modify_if(~ .x == day, ~rbinom(1, 1, paste("p", day, sep = "")) * day)
    vec
    }

newvec <- died(vec = status, day = 3)
r arrays function purrr
1个回答
0
投票

paste("p", day, sep = "")只是一个字符串,R不知道如何在函数died中对其求值。有几种方法可以评估字符串对象,但是在这种情况下,它会使代码变得难看。您可以创建一个向量并将其传递给函数。

p_list <- c(0.50,0.45,0.65,0.55)

我们通过位置获得概率

died <- function (vec, day, p_list) {
   purrr::modify_if(vec,  ~.x == day, ~rbinom(1, 1,p_list[day]) * day)
}

set.seed(123)
status <- as.numeric(sample(1:4, 10, replace = TRUE))
died(vec = status, day = 3, p_list)
#[1] 0 3 0 2 3 2 2 2 3 1
© www.soinside.com 2019 - 2024. All rights reserved.