在R语言中使用dplyr按顺序条件创建列的方法
解决方法:用
coalesce()按优先级取第一个非NA值 嘿,我完全懂你的需求——想要按条件1到5的优先级,依次从choice1到choice5中取第一个不缺失的值作为final_choice,而且不想写一堆嵌套的ifelse对吧?其实在dplyr(tidyverse的一部分)里有个专门解决这类问题的函数:coalesce(),它能完美满足你的需求!
什么是coalesce()?
这个函数会按你传入参数的顺序,返回第一个非NA的值,正好匹配你“先看choice1,缺失就看choice2,以此类推”的逻辑,代码会简洁很多,也不容易出错。
修改后的完整代码
library(dplyr) # 若未加载tidyverse,需先加载这个包 ungho <- unghoraw %>% # 条件1: mutate(choice1 = ifelse(UN_miss=="No data","GHO",ifelse(GHO_miss=="No data","UN",NA))) %>% # 条件2: mutate(choice2 = ifelse(diff_qual=="no diff","GHO",NA)) %>% # 条件3: mutate(choice3 = ifelse(nb_years_gho>=nb_years_un,"GHO",ifelse(nb_years_un>nb_years_gho,"UN",NA))) %>% # 条件4: mutate(choice4 = ifelse(dec_gho>=dec_un,"GHO",ifelse(dec_un>dec_gho,"UN",NA))) %>% # 条件5: mutate(choice5 = ifelse(last_year_gho>=last_year_un,"GHO",ifelse(last_year_un>last_year_gho,"UN",NA))) %>% # 按优先级取第一个非NA值 mutate(final_choice = coalesce(choice1, choice2, choice3, choice4, choice5))
为什么你之前的代码无效?
你之前的嵌套ifelse存在语法错误:在第三个ifelse里,你写了ifelse(!is.na(choice3,choice4,...),这里的is.na()参数写法有误,应该是!is.na(choice3),再指定返回choice3后才继续判断choice4。不过用coalesce()完全可以避免这种容易出错的嵌套写法。
内容的提问来源于stack exchange,提问作者Nellicopter
相关产品推荐
相关产品推荐

