我是靠谱客的博主 缓慢哈密瓜,最近开发中收集的这篇文章主要介绍R语言 多次使用判断语句时 避免嵌套ifelse,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 千随

最后

以上就是缓慢哈密瓜为你收集整理的R语言 多次使用判断语句时 避免嵌套ifelse的全部内容,希望文章能够帮你解决R语言 多次使用判断语句时 避免嵌套ifelse所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部