如何在R语言管道链中新增列标记行是否包含NA值?
在R语言管道链中为数据框新增标记NA的布尔字段
需求
为现有数据框新增布尔类型字段has_na,标记每行是否包含NA值。
数据框创建代码
mydf <- data.frame( x = 1:5, y = 5:1 ) mydf[4,2] <- NA mydf[3,1] <- NA
生成的数据框内容:
mydf x y 1 1 5 2 2 4 3 NA 3 4 4 NA 5 5 1
错误尝试及报错
用户尝试使用原生管道结合mutate,但因占位符使用错误报错:
mydf |> mutate(has_na = complete.cases(_))
报错信息:
Error in mutate(mydf, has_na = complete.cases("_")) :
invalid use of pipe placeholder
正确解决方案
方法1:利用complete.cases()取反
complete.cases()会返回每行是否无NA(TRUE表示无NA),取反后即可得到每行是否存在NA:
library(dplyr) mydf |> mutate(has_na = !complete.cases(.))
运行结果:
x y has_na 1 1 5 FALSE 2 2 4 FALSE 3 NA 3 TRUE 4 4 NA TRUE 5 5 1 FALSE
注:在原生管道|>中,也可以用_替代.作为占位符,效果一致:
mydf |> mutate(has_na = !complete.cases(_))
方法2:通过rowSums()统计NA数量
统计每行的NA个数,判断是否大于0来生成布尔字段:
mydf |> mutate(has_na = rowSums(is.na(.)) > 0)
方法3:用if_any()遍历列检测NA
这是tidyverse风格的写法,明确检查每行任意一列是否存在NA:
mydf |> mutate(has_na = if_any(everything(), is.na))
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

