如何在R语言中为数据框新增按优先级取值的列?
没问题!我给你整理了Base R、tidyverse和data.table三种常用框架下的实现方案,每个都配了可直接运行的代码示例,你可以根据自己的工作环境选择~
先准备一份测试数据,方便你验证效果:
df <- data.frame( Var1 = c(1, 2, NA, 4), Var2 = c(NA, 5, 6, NA), Var3 = c(9, NA, NA, 10) )
Base R 实现
如果不想加载额外包,Base R有两种常用方式:
- 嵌套
ifelse:逻辑最直接,适合变量少的情况
df$NewVar <- ifelse(!is.na(df$Var3), df$Var3, ifelse(!is.na(df$Var2), df$Var2, df$Var1))
Reduce函数:更优雅,变量多的时候不用写多层嵌套,本质是依次替换NA值
df$NewVar <- Reduce(function(x, y) ifelse(is.na(x), y, x), list(df$Var3, df$Var2, df$Var1))
tidyverse 实现
tidyverse里的dplyr::coalesce专门就是干这个的——按顺序返回第一个非NA值,代码极简:
library(dplyr) df <- df %>% mutate(NewVar = coalesce(Var3, Var2, Var1))
如果你习惯用管道流,这个方式最顺手,可读性也强。
data.table 实现
data.table提供了fcoalesce函数,和dplyr的coalesce逻辑一致,配合data.table的赋值语法,效率很高(尤其适合大数据集):
library(data.table) # 先把data.frame转成data.table setDT(df) # 直接新增列 df[, NewVar := fcoalesce(Var3, Var2, Var1)]
运行完任意一种方法后,你可以查看结果:
print(df)
输出应该是:
Var1 Var2 Var3 NewVar 1 1 NA 9 9 2 2 5 NA 5 3 NA 6 NA 6 4 4 NA 10 10
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

