我想用R写一个条件:首先,我编写了这段代码,用于生成0到4:effort <-sample(0:4, 1000,replace= T)之间的随机整数,然后生成一个条件格式:#(如果effort=0然后返回4500,如果effort=1然后返回4300,如果effort=2然后返回3700,如果effort=3然后返回4700,如果effort=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)}}#但它不起作用!我不知道怎样才能修好它!
发布于 2021-01-31 12:52:03
以下是问题代码的修正版本。
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发布于 2021-01-31 13:03:27
它对case_when也很有用。
library(dplyr)
bso <- function(effort){
case_when(effort == 0~ 4500,
effort == 1~ 4300,
effort == 2~ 3700,
effort == 3~ 4700, TRUE ~ 5300)
}https://stackoverflow.com/questions/65978950
复制相似问题