R语言 多次使用判断语句时 避免嵌套ifelse

博客介绍了如何在R语言中创建自己的多条件判断函数`multi_ifelse`,以替代嵌套的`ifelse`语句,使代码更简洁。作者提供了两种实现方式,并通过测试用例展示了其工作原理。此外,还展示了如何在dplyr的`mutate`操作中使用该函数,以根据`Species`对iris数据集进行分类。
摘要由CSDN通过智能技术生成

R语言似乎没有多次做判断的快捷函数(也许是我不知道?请大佬指点
于是自己写了一个,避免因为嵌套ifelse让代码看起来很乱

首先想到的方式:

multi_ifelse<-function(conditions,values){
  # conditions是包含逻辑值的向量,values是包含逻辑值为真时对应的值的向量
  n_cond=length(conditions)
  n_val=length(values)
  if(n_val-n_cond<0) stop("values的数量必须与conditions相等或多1")
  # 若conditions全为假则返回NA
  if(n_val-n_cond==0) values<-c(values,NA)
  if(sum(conditions)==0){
    return(values[-1])
 }else {
    first_T=min(c(1:n_cond)[conditions])
    return(values[first_T])
 }
}

测试

multi_ifelse(
  c(1+1==3,1+2==3,5+5==10,6+6==7),
  c("1+1==3","1+2==3","5+5==10","6+6==7")
)
# [1] "1+2==3"

又想到了另一种方式,看上去更简洁:

multi_ifelse2<-function(...){
  # 输入的是一个个二元列表,第一个是逻辑值,第二个是值
  dt<-list(...)
  for (pairs in dt){
    if (pairs[[1]]) return(pairs[[2]])
  }
  # 若conditions全为假则返回NA
  return(NA)
}

测试

multi_ifelse2(
  list(1+1==3,"1+1=3"),
  list(1+2==3,"1+2=3"),
  list(5+5==8,"5+5=8"),
  list(6+6==12,"6+6=12")
)
# [1] "1+2=3"

注意该函数如果要配合mutate使用,应先使用rowwise()将数据按行处理

# 配合dplyr的mutate使用:
library(dplyr)
head(iris)
summary(iris$Species)
#    setosa versicolor  virginica 
#        50         50         50 

# 新建变量mygroup,将"setosa"划为A类,将"versicolor","virginica"划为B类
my_iris<- 
  iris %>%
  rowwise() %>% #这里必须要rowwise,因为这个函数是一个一个值判断的
  mutate(mygroup=multi_ifelse2(
    list(Species=="setosa","A"),
    list(Species %in% c("versicolor","virginica"),"B"))
    ) %>% ungroup()
    
# 查看效果
my_iris %>% count(Species,mygroup)
# # A tibble: 3 x 3
# mygroup Species        n
# <chr>   <fct>      <int>
# 1 A       setosa        50
# 2 B       versicolor    50
# 3 B       virginica     50

by 千随

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值