概述
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复