如何在R中编写条件

mitkmikd  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(93)

我想在R中写一个条件:首先,我编写了以下代码,用于生成0到4之间的随机整数:effort <-sample(0:4, 1000,replace= T)然后我想生成一个条件格式:#(如果努力=0,则返回4500,如果努力=1,则返回4300,如果努力=2,则返回3700,如果努力=3,则返回4700,如果努力=4,则返回5300)

所以我写了这些代码:

bso<- function(effort){
if(effort==0){return(4500)}
if(effort==1){return(4300)}
if(effort==2){return(3700)}
if(effort==3){return(4700)}
if(effort==4){return(5300)}}

但它不起作用!我不知道我该怎么做!

ru9i0ody

ru9i0ody1#

下面是问题代码的更正版本。

bso <- function(effort){
  ifelse(effort == 0, 4500,
         ifelse(effort == 1, 4300,
                ifelse(effort == 2, 3700,
                       ifelse(effort == 3, 4700, 5300)
                )
         )
  )
}

但是下面的版本要快得多。它使用输入变量effort作为索引向量。

bso2 <- function(effort){
  c(4500, 4300, 3700, 5700, 5300)[effort + 1L]
}

使用microbenchmark封装进行性能测试。

library(microbenchmark)

n <- 1e4
X <- sample(0:4, n, TRUE)
mb <- microbenchmark(
  bso = bso(X),
  bso2 = bso2(X)
)
print(mb, order = "median")
#Unit: microseconds
# expr      min        lq      mean    median       uq       max neval cld
# bso2   78.660  119.9295  127.4464  129.7135  139.198   193.971   100  a 
#  bso 1469.328 1892.0490 2781.1861 2115.7405 2156.303 17435.984   100   b
kqlmhetl

kqlmhetl2#

对于case_when也可能有用

library(dplyr)
bso <- function(effort){
  case_when(effort == 0 ~ 4500,
            effort == 1 ~ 4300,
            effort == 2 ~ 3700,
            effort == 3 ~ 4700, 
            TRUE ~ 5300)
  
}

相关问题