如何移除合并后数据框中的全NA列?解决dplyr中“not_all_na未找到”的报错问题
移除数据框全NA列的报错解决办法
你想用dplyr管道语法移除全NA列,但遇到了object 'not_all_na' not found的报错,原因很简单:not_all_na并不是R的内置函数,R找不到这个自定义函数才会抛出错误。下面给你几种实用的解决方案:
方案1:自定义判断函数后使用
先定义一个判断“列不全为NA”的函数,再放到where()里就能正常运行了:
# 定义判断函数:返回TRUE表示该列不是全NA not_all_na <- function(x) { !all(is.na(x)) } # 执行筛选 psknk_all_filtered <- ps_knk_alldata %>% select(where(not_all_na))
方案2:直接用匿名函数(无需额外定义)
如果不想单独写函数,可以把判断逻辑直接嵌入where(),用匿名函数实现,更简洁:
# 标准匿名函数写法 psknk_all_filtered <- ps_knk_alldata %>% select(where(function(x) !all(is.na(x)))) # R 4.1及以上版本支持的箭头函数(更简洁) psknk_all_filtered <- ps_knk_alldata %>% select(where(~ !all(is.na(.x))))
方案3:Base R 原生写法(不用tidyverse)
如果你习惯用原生R语法,也能轻松实现:
# 筛选出NA数量不等于行数的列(即不是全NA的列) psknk_all_filtered <- ps_knk_alldata[, colSums(is.na(ps_knk_alldata)) != nrow(ps_knk_alldata)]
从你提供的head()输出来看,确实存在多列全为NA的情况,上面任意一种方法都能帮你把这些无效列移除,保留有实际数据的列。
内容的提问来源于stack exchange,提问作者Ashish Kulkarni
相关产品推荐
相关产品推荐

