R语言dplyr如何筛选指定列中含至少一个非NA值的行
dplyr 实现方案
你之前的写法不生效是逻辑和用法完全不匹配:
df %>% select(c(13:19)) %>% !is.na()语法错误,!is.na()不能直接作用于整个数据框做行筛选na.omit(df[,c(13:19)])逻辑相反:这个函数会删除任意一列存在NA的行,和你要的「至少有一个非NA就保留」的需求完全相悖select_if(~ !any(is.na(.)))是列筛选操作,会删除所有存在NA的列,根本不会做行筛选
推荐写法(dplyr 1.0.0+ 支持,最简洁)
用if_any做逐行条件判断即可:
library(dplyr) # 如果你最终只需要保留13-19列的结果,用这个写法 res <- df %>% filter(if_any(13:19, ~!is.na(.))) %>% select(13:19) # 如果你需要保留数据框所有原列,只是按13-19列的规则筛行,删掉select(13:19)即可
兼容老版本dplyr的写法
如果你的dplyr版本低于1.0.0没有if_any函数,可以搭配rowSums实现相同逻辑:
res <- df %>% filter(rowSums(!is.na(select(., 13:19))) > 0) %>% select(13:19)
逻辑说明
if_any(13:19, ~!is.na(.))会逐行遍历13到19列,只要任意一列存在非NA值,就对该行返回TRUE,符合你要的筛选规则rowSums写法的逻辑是逐行统计13-19列中非NA值的数量,只要数量大于0(即至少1个有效非NA值)就保留该行
用你提供的示例数据运行上述代码,会得到你期望的结果,自动过滤掉13-19列全为NA的行:
13 14 15 ... 19 1 cool not cool NA ... NA 2 NA 1 NA ... NA
内容的提问来源于stack exchange,提问作者Dre Day
相关产品推荐
相关产品推荐

