使用rowwise()处理整行数据:如何识别全为NA值的观测行?
全NA行识别的tidy风格解决方案
以下两种方案均不需要硬编码列名,可适配任意列数、任意列名的数据集:
方法1:使用if_all()(推荐,最简洁)
dplyr 1.0.0及以上版本提供的if_all()函数可以直接按行判断选中的所有列是否都满足条件,是目前最优的实现方式:
- 标记全NA行
frm %>% # 新增列标记当前行是否所有列都是NA mutate(all_values_missing = if_all(everything(), is.na))
- 直接筛选出全NA的行
frm %>% filter(if_all(everything(), is.na))
如果不需要检查全部列,只需要把everything()替换为对应的tidyselect选择规则即可,比如要排除名为id的列,可以写成everything() - id。
方法2:使用rowwise() + c_across()(兼容旧版dplyr)
如果是低于1.0.0版本的dplyr,可以用c_across()按行合并选中列后判断:
frm %>% rowwise() %>% mutate(all_values_missing = all(is.na(c_across(everything())))) %>% ungroup() # 处理完成后取消行分组,避免影响后续操作
两种方案在示例数据集上运行,都会正确识别第四行是唯一全为NA的行。
内容的提问来源于stack exchange,提问作者John Posner
相关产品推荐
相关产品推荐

