R语言似乎没有多次做判断的快捷函数(也许是我不知道?请大佬指点
于是自己写了一个,避免因为嵌套ifelse让代码看起来很乱
首先想到的方式:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15multi_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]) } }
测试
复制代码
1
2
3
4
5
6multi_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"
又想到了另一种方式,看上去更简洁:
复制代码
1
2
3
4
5
6
7
8
9
10multi_ifelse2<-function(...){ # 输入的是一个个二元列表,第一个是逻辑值,第二个是值 dt<-list(...) for (pairs in dt){ if (pairs[[1]]) return(pairs[[2]]) } # 若conditions全为假则返回NA return(NA) }
测试
复制代码
1
2
3
4
5
6
7
8multi_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()将数据按行处理
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25# 配合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语言内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复