如何在R中不指定列名删除多列含特定值的行
问题描述
我有一个大型数据集,没法逐一列出来所有可能含特定值的列名。想删除**只要任意一列有'BYE'**的所有行,试了下面的代码但没成功:
示例数据
library(dplyr) (df <- data.frame( column1 = c('4', '5', '6', '7', 'BYE'), column2 = c('abc', 'def', 'g', 'hi', 'jk'), column3 = c('yes', NA, 'BYE', 'no', 'yes'), column4 = c('BYE', 'no', 'BYE', NA, 'yes') )) # 失败的尝试 df %>% filter_all(any_vars(. != 'BYE'))
为啥原来的代码不行?
你写的filter_all(any_vars(. != 'BYE'))逻辑搞反了:它是保留**至少有一列不等于'BYE'**的行——几乎所有行都满足这个条件,自然删不掉你想删的那些。另外还没处理NA的问题:NA != 'BYE'会返回NA,filter默认会把这类行剔除,但你可能不想把含NA的行删掉,除非NA是'BYE'。
正确代码这么写
方法1:兼容你原写法的filter_all版本
把any_vars换成all_vars,同时明确排除NA的干扰:
# 保留所有列既不是NA也不是'BYE'的行 df %>% filter_all(all_vars(!is.na(.) & . != 'BYE'))
方法2:新版dplyr推荐的across写法(更灵活)
从dplyr 1.0.0开始,官方推荐用across替代filter_all,可读性更好:
df %>% filter(across(everything(), ~ !is.na(.) & . != 'BYE'))
结果说明
运行后会得到仅保留**没有任何一列是'BYE'**的行:
column1 column2 column3 column4 1 5 def <NA> no 2 7 hi no <NA>
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

