R语言filter_at函数问题:移除指定多列全为NA的行
问题分析与解决办法
为什么你的代码得到空数据框?
你写的代码逻辑和需求完全相反:filter_at(vars(features), all_vars(!is.na(.))) 的作用是只保留3-64列全部都不是NA的行,但你的需求是移除这些列全为NA的行。如果你的实际数据里没有任何一行的3-64列全是非NA值,运行这段代码就会得到空数据框。
正确的解决方法
这里提供几种符合需求的写法:
方法1:修正filter_at的逻辑
把all_vars换成any_vars,这样会保留3-64列中至少有一个非NA值的行(也就是过滤掉全为NA的行):
features <- names(dat)[3:64] dat <- dat %>% filter_at(vars(features), any_vars(!is.na(.)))
方法2:用rowSums直接判断NA数量
计算每行3-64列的NA个数,只保留NA个数不等于列总数的行:
features_idx <- 3:64 dat <- dat %>% filter(rowSums(is.na(.[, features_idx])) != length(features_idx))
方法3:用tidyverse推荐的across语法(替代filter_at)
现在tidyverse官方更推荐用across/if_all这类新函数,写法更直观:
dat <- dat %>% filter(!if_all(3:64, is.na))
if_all(3:64, is.na)会判断每行的3-64列是否全为NA,前面加!就会保留那些不全为NA的行,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者alexmelina
相关产品推荐
相关产品推荐

