R dplyr filter函数执行后数值列全为0,原因何在?
排查dplyr filter后数值列全为0的奇怪问题
嘿,这个情况确实有点让人摸不着头脑——毕竟filter()是我们日常用dplyr时最顺手的工具之一,突然出这种问题肯定挺闹心!我来分享几个最可能的原因和排查思路:
NA值在偷偷干扰过滤逻辑
如果你的CODE_FRAIS列里存在NA值,那么CODE_FRAIS != "CINT"对这些NA行返回的结果是NA,而dplyr::filter()默认会把返回NA的行也一并过滤掉。如果刚好剩下的行数值列本来就全是0,就会出现你看到的情况。
你可以先跑这条命令看看CODE_FRAIS的分布(包括NA的数量):table(data1$CODE_FRAIS, useNA = "always")如果确实有NA,试试修改过滤条件,把NA的行也保留下来:
data1 <- data1 %>% dplyr::filter(CODE_FRAIS != "CINT" | is.na(CODE_FRAIS))看看数值列是不是恢复正常了。
函数冲突导致执行了错误的filter
R里有不止一个filter()函数——比如stats包也自带一个filter(),如果你的环境里加载了多个包,可能出现函数冲突,导致你调用的不是dplyr的过滤函数。试试明确指定用dplyr::filter():data1 <- data1 %>% dplyr::filter(CODE_FRAIS != "CINT")说不定就能解决问题。
列类型的隐性错误
先检查一下数据的列类型,跑这条命令看看细节:str(data1)- 确认
CODE_FRAIS是字符型(character)而不是因子型(factor):如果是因子且"CINT"不在因子的水平列表里,CODE_FRAIS != "CINT"会返回全TRUE,不过这时候应该不会过滤掉任何行,但也可能引发其他隐性问题。 - 确认数值列确实是
numeric或integer类型:如果数值列被意外转换成了逻辑型(logical),那么FALSE会显示成0,TRUE是1,要是所有数值列都变成了FALSE,就会全显示0。
- 确认
会不会是数据本身的巧合?
虽然听起来有点离谱,但说不定过滤后剩下的行数值列本来就全是0?你可以跑这条命令看看数值列的统计信息:data1 %>% filter(CODE_FRAIS != "CINT") %>% select(where(is.numeric)) %>% summary()如果统计结果里最小值、最大值、均值都是0,那就是数据本身的问题,不是
filter()的锅啦。
先试试这些方法,应该能很快找到问题根源!
内容的提问来源于stack exchange,提问作者Alpha Blue
相关产品推荐
相关产品推荐

