首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中写入条件

如何在R中写入条件
EN

Stack Overflow用户
提问于 2021-01-31 12:12:42
回答 2查看 30关注 0票数 0

我想用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)

所以我写了这些代码:

代码语言:javascript
复制
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)}}

#但它不起作用!我不知道怎样才能修好它!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-31 12:52:03

以下是问题代码的修正版本。

代码语言:javascript
复制
bso <- function(effort){
  ifelse(effort == 0, 4500,
         ifelse(effort == 1, 4300,
                ifelse(effort == 2, 3700,
                       ifelse(effort == 3, 4700, 5300)
                )
         )
  )
}

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

代码语言:javascript
复制
bso2 <- function(effort){
  c(4500, 4300, 3700, 5700, 5300)[effort + 1L]
}

性能测试是用封装microbenchmark进行的。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2021-01-31 13:03:27

它对case_when也很有用。

代码语言:javascript
复制
library(dplyr)
bso <- function(effort){
  case_when(effort == 0~ 4500,
         effort == 1~ 4300,
                effort == 2~ 3700,
                       effort == 3~ 4700, TRUE ~ 5300)
              
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65978950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档