减少R中条件语句的数量?

减少R中条件语句的数量?,r,statistics,modeling,R,Statistics,Modeling,我有一个巨大的代码块,它有不同的if语句和不同的for语句。有没有一种方法可以减少代码中if和for循环的数量,从而使代码更加精简和高效 library(tidyverse) occ_simulation <- function(nyears, lambda, alpha, beta){ data_matrix <- matrix(, nrow = nyears, ncol = 6) for (z in 1:nyears){ data_matrix[z]

我有一个巨大的代码块,它有不同的if语句和不同的for语句。有没有一种方法可以减少代码中if和for循环的数量,从而使代码更加精简和高效

library(tidyverse)

occ_simulation <- function(nyears, lambda, alpha, beta){
  
  data_matrix <- matrix(, nrow = nyears, ncol = 6)
  
  for (z in 1:nyears){
    data_matrix[z][1] <- z
  }
  
  for (yr in 1:nyears){
    
    poisson_sim = rpois(1, lambda)
    
    for (number_of_events in poisson_sim){
      
      if (number_of_events == 1){
        
        beta_sim = rbeta(1, alpha, beta)
        data_matrix[yr, 2] <- beta_sim
        
      } else if (number_of_events == 2){
        
          for (i in 2:3){
            
            beta_sim = rbeta(1, alpha, beta)
            data_matrix[yr, i] <- beta_sim
            
          }
        
      } else if (number_of_events == 3){
          
          for (i in 2:4){
            
            beta_sim = rbeta(1, alpha, beta)
            data_matrix[yr, i] <- beta_sim
        
          }
        
      } else if (number_of_events == 4){
        
          for (i in 2:5){
            
            beta_sim = rbeta(1, alpha, beta)
            data_matrix[yr, i] <- beta_sim
        
          }
          
      } else{
        
          for (i in 2:6){
            
            beta_sim = rbeta(1, alpha, beta)
            data_matrix[yr, i] <- beta_sim
        }
    
      }
      
    }
    
  }
  
  sorted_matrix <- cbind(data_matrix[,1],t(apply(data_matrix[,2:6],1,function(x) sort(x))))

G <- sorted_matrix %>% as.data.frame %>%
  pivot_longer(-V1) %>%
  ggplot(aes(x=factor(V1),y=value,color=name,group=name))+
  geom_point()+
  labs(color='Column',x='Time (Years)', y ='Probability')+
  theme_bw()
return(G)
}

manual = occ_simulation(10, 10, 2, 20)
manual

干杯

这是你在文本中提到的所有内容,但跳过了排序,因为你没有提到它,我不知道你为什么这么做:

occ_simulation2 = function(n_year, lambda, alpha, beta, max_event){
  beta_events = matrix(rbeta(n_year * max_event, shape1 = alpha, shape2 = beta), nrow = n_year)
  n_events_per_year = rpois(n_year, lambda = lambda)
  for(i in which(n_events_per_year < max_event)) {
    beta_events[i, (n_events_per_year[i] + 1):max_event] = NA
  }
  cbind(1:n_year, beta_events)
}

occ_simulation2(n_year = 10, lambda = 10, alpha = 2, beta = 20, max_event = 5)
#       [,1]        [,2]        [,3]       [,4]       [,5]       [,6]
#  [1,]    1 0.035977205 0.131498127 0.06717396 0.07395549 0.16532084
#  [2,]    2 0.092411677 0.010091762 0.14054564 0.07560796 0.17471096
#  [3,]    3 0.033394007 0.017621993 0.06469264 0.10337253 0.19579706
#  [4,]    4 0.165301623 0.131111006 0.03285909 0.38068480 0.05473743
#  [5,]    5 0.007820079 0.196192197 0.25096961 0.06851775 0.35516715
#  [6,]    6 0.028011863 0.003841574 0.16924708 0.12446178 0.06525773
#  [7,]    7 0.133261625 0.059417090 0.09608348 0.07471339 0.08303839
#  [8,]    8 0.076545497 0.110469131 0.23364757 0.09250536 0.03295593
#  [9,]    9 0.051244148 0.070419370 0.07127251 0.11847306 0.04112807
# [10,]   10 0.104567386 0.188888704 0.02556781 0.10075848 0.02456839
occ\u模拟2=功能(n年、λ、α、β、最大事件){
贝塔事件=矩阵(rbeta(n年*最大事件,形状1=α,形状2=贝塔),nrow=n年)
n年事件数=RPOI(n年,λ=λ)
对于(i,其中(每年n次事件<最大事件)){
beta_事件[i,(n_事件/u年[i]+1):最大事件]=NA
}
cbind(1:n年,测试版事件)
}
occ模拟2(n年=10,λ=10,α=2,β=20,最大事件=5)
#       [,1]        [,2]        [,3]       [,4]       [,5]       [,6]
#  [1,]    1 0.035977205 0.131498127 0.06717396 0.07395549 0.16532084
#  [2,]    2 0.092411677 0.010091762 0.14054564 0.07560796 0.17471096
#  [3,]    3 0.033394007 0.017621993 0.06469264 0.10337253 0.19579706
#  [4,]    4 0.165301623 0.131111006 0.03285909 0.38068480 0.05473743
#  [5,]    5 0.007820079 0.196192197 0.25096961 0.06851775 0.35516715
#  [6,]    6 0.028011863 0.003841574 0.16924708 0.12446178 0.06525773
#  [7,]    7 0.133261625 0.059417090 0.09608348 0.07471339 0.08303839
#  [8,]    8 0.076545497 0.110469131 0.23364757 0.09250536 0.03295593
#  [9,]    9 0.051244148 0.070419370 0.07127251 0.11847306 0.04112807
# [10,]   10 0.104567386 0.188888704 0.02556781 0.10075848 0.02456839

如果你能在文本或评论中描述你的cod在做什么,那将非常有帮助。有一些奇怪的事情:例如
poisson\u sim=rpois(1,lambda)
所以
poisson\u sim
的长度为1。因此,
for(poisson sim中的事件数)
将只有一次迭代。它应该是针对(1:poisson sim中的事件数)的bug吗?或者是
poisson\u sim
的长度应该大于1的错误?或者它不是一个bug,只是一个不必要的
for
循环?除非你告诉我们你的代码-它应该做什么,你认为每一块正在做什么-我们没有办法知道。我现在要添加更多。啊,我只是做了排序,因为当我绘制图形时,我希望最大点是相同的颜色。谢谢你的回答,非常感谢!我试着使用那段代码,但运行时它给了我一个错误,说nyear没有定义,我不太确定错误来自哪里?哦,我的打字错误。我将参数命名为
nyear
,然后在函数中使用
n_year
。现在正在编辑。再次检查了此代码,但它给了我一个错误,即没有定义max_事件,我不确定从何处获取它?哦,是的,这应该是函数的一个参数。我现在把它加进去。将其设置为5以满足您的“最多5个截止值”标准。
occ_simulation2 = function(n_year, lambda, alpha, beta, max_event){
  beta_events = matrix(rbeta(n_year * max_event, shape1 = alpha, shape2 = beta), nrow = n_year)
  n_events_per_year = rpois(n_year, lambda = lambda)
  for(i in which(n_events_per_year < max_event)) {
    beta_events[i, (n_events_per_year[i] + 1):max_event] = NA
  }
  cbind(1:n_year, beta_events)
}

occ_simulation2(n_year = 10, lambda = 10, alpha = 2, beta = 20, max_event = 5)
#       [,1]        [,2]        [,3]       [,4]       [,5]       [,6]
#  [1,]    1 0.035977205 0.131498127 0.06717396 0.07395549 0.16532084
#  [2,]    2 0.092411677 0.010091762 0.14054564 0.07560796 0.17471096
#  [3,]    3 0.033394007 0.017621993 0.06469264 0.10337253 0.19579706
#  [4,]    4 0.165301623 0.131111006 0.03285909 0.38068480 0.05473743
#  [5,]    5 0.007820079 0.196192197 0.25096961 0.06851775 0.35516715
#  [6,]    6 0.028011863 0.003841574 0.16924708 0.12446178 0.06525773
#  [7,]    7 0.133261625 0.059417090 0.09608348 0.07471339 0.08303839
#  [8,]    8 0.076545497 0.110469131 0.23364757 0.09250536 0.03295593
#  [9,]    9 0.051244148 0.070419370 0.07127251 0.11847306 0.04112807
# [10,]   10 0.104567386 0.188888704 0.02556781 0.10075848 0.02456839