R语言使用dplyr::filter结合!is.na删除NA值不生效问题咨询
代码不生效的核心原因
tidyverse的select支持直接传入字符串作为列名,但filter的参数是求值表达式,你写的'1month'会被识别为字符串常量,而非数据框的列名。is.na('1month')实际是判断字符串"1month"本身是否为NA,返回结果永远是FALSE,取反后就是TRUE,所以过滤条件对所有行都生效,不会删除任何行,自然会保留NA值的行。
正确实现方式
使用!is.na()实现过滤
因为你的列名是数字开头的非标准列名,需要用反引号(`)包裹列名,让R识别为数据框的列:
example %>% select(`1month`) %>% filter(!is.na(`1month`))
如果需要动态引用列名,也可以用.data代词:
target_col <- "1month" example %>% select(all_of(target_col)) %>% filter(!is.na(.data[[target_col]]))
能不能用!=实现NA过滤?
不行。在R的语法规则中,NA和任何值做比较运算(包括==、!=)返回的结果都是NA,filter会将逻辑值为NA的行判定为不满足条件直接过滤,如果你写filter(1month != NA)会得到空表,完全不符合需求,判断NA必须使用专门的is.na()函数。
内容的提问来源于stack exchange,提问作者D.PARK
相关产品推荐
相关产品推荐

