在R语言中从多列创建仅保留非NA值的变量(优先取首列非NA值)
解决方案
方法1:使用dplyr的coalesce()函数
这是最简洁的实现方式,coalesce()会严格按照传入列的顺序,返回每行第一个非NA的值,天然支持任意多列的场景:
library(dplyr) name1 <- c("a", NA, "b") name2 <- c(NA, "c", "d") mydf <- cbind.data.frame(name1, name2) # 添加目标结果列 mydf$result <- coalesce(mydf$name1, mydf$name2) # 若需处理更多列,直接追加参数即可,例如: # mydf$result <- coalesce(mydf$name1, mydf$name2, mydf$name3, mydf$name4)
运行后mydf$result会得到预期结果:"a", "c", "b"。
方法2:基础R原生实现(无需额外包)
如果不想加载第三方包,可以用apply()逐行处理,提取每行第一个非NA元素:
name1 <- c("a", NA, "b") name2 <- c(NA, "c", "d") mydf <- cbind.data.frame(name1, name2) # 定义辅助函数:提取向量中第一个非NA值 first_non_na <- function(x) x[!is.na(x)][1] # 应用到数据框的每一行 mydf$result <- apply(mydf, 1, first_non_na)
该方法同样适配任意多列的情况,会按数据框原有列的顺序查找第一个非NA值。
结果验证
两种方法最终得到的结果完全一致:
> mydf$result [1] "a" "c" "b"
内容的提问来源于stack exchange,提问作者Muhammad Kamil
相关产品推荐
相关产品推荐

