tidyverse中filter行筛选时缺失值存在的一个坑

news/2024/10/30 19:37:38/

大家好,我是邓飞,好久没有更新博客了,是因为好久没有进步了。

之前我认为鲁迅说的对,他在《野草》中写道:“当我沉默着的时候,我觉得充实;我将开口,同时感到空虚”。现在确切的情况是,当我停止更新时,我感到充实和无压力,然后越来越不想更新,最后发现没有什么可写的,一旦我想写点东西,就是特别空虚,腹中空空但是又开始大腹便便,好像肚子里没东西,但是都是肉,成年人的忧伤……

回到正轨,今天我用dplyr的filter质控数据时,出现了我意想不到的结果,本着“学到就要分享、输出是最好的学习”原则,模拟一个数据,介绍一下这个坑,以及如何避免。

1. 首先模拟一套数据


set.seed(123)
df = data.frame(ID = 1:10, Sex = c("F","F","F","F","NA","F","F","NA","M","M"), y1 = c(rnorm(9),NA))
df

数据如下:

> dfID Sex          y1
1   1   F -0.56047565
2   2   F -0.23017749
3   3   F  1.55870831
4   4   F  0.07050839
5   5  NA  0.12928774
6   6   F  1.71506499
7   7   F  0.46091621
8   8  NA -1.26506123
9   9   M -0.68685285
10 10   M          NA

2. 提取Sex不是F的行

我有三种方法:

  • 第一种,用!=
  • 第二种,用! ==
  • 第三种,用 ! %in%

示例代码如下:

df %>% filter(Sex != "F")
df %>% filter(!Sex == "F")
df %>% filter(!Sex %in% "F")

示例结果:

可以看到,三者结果一致。

在这里插入图片描述

3. 如果把数据保存到Excel再读取

write.xlsx(df,"df_test.xlsx")

读取excel数据:

df = read.xlsx("df_test.xlsx")
df

4. 诡异的时刻:Excel读取的报错

library(tidyverse)
df %>% filter(Sex != "F")
df %>% filter(!Sex == "F")
df %>% filter(!Sex %in% "F")

前两个都是错误的,它自动忽略了NA的行……

在这里插入图片描述
只有第三种是正确的:

5. R中构建的数据框没问题,Excel转一圈坏了

就是这么诡异。

完整的代码:

set.seed(123)
df = data.frame(ID = 1:10, Sex = c("F","F","F","F","NA","F","F","NA","M","M"), y1 = c(rnorm(9),NA))
df# 
library(tidyverse)
library(openxlsx)
df %>% filter(Sex != "F")
df %>% filter(!Sex == "F")
df %>% filter(!Sex %in% "F")
write.xlsx(df,"df_test.xlsx")# 读取数据
df1 = read.xlsx("df_test.xlsx")
df1
str(df1)
library(tidyverse)
df1 %>% filter(Sex != "F")
df1 %>% filter(!Sex == "F")
df1 %>% filter(!Sex %in% "F")

比较一下两个数据框:R中的事NA,Excel读取的是<NA>

在这里插入图片描述
用drop_na处理一下,看是否是缺失值:

结果发现,R中我构建向量时用的是"NA",而不是NA,被作为字符,所以用filter !=可以提取NA的行。

6. 重新构建R数据框

set.seed(123)
df2 = data.frame(ID = 1:10, Sex = c("F","F","F","F",NA,"F","F",NA,"M","M"), y1 = c(rnorm(9),NA))
df2


用drop_na试一下,没有问题:

> df2 %>% drop_na(Sex)ID Sex         y1
1  1   F -0.4456620
2  2   F  1.2240818
3  3   F  0.3598138
4  4   F  0.4007715
5  6   F -0.5558411
6  7   F  1.7869131
7  9   M -1.9666172
8 10   M         NA

用三种方法过滤,试一下:前两种都不理想。

> df2 %>% filter(Sex != "F")ID Sex        y1
1  9   M -1.966617
2 10   M        NA
> df2 %>% filter(!Sex == "F")ID Sex        y1
1  9   M -1.966617
2 10   M        NA
> df2 %>% filter(!Sex %in% "F")ID  Sex         y1
1  5 <NA>  0.1106827
2  8 <NA>  0.4978505
3  9    M -1.9666172
4 10    M         NA

结论:filter过滤时,会自动忽略NA的行,所以,用%in%才是靠谱的!!!


http://www.ppmy.cn/news/104091.html

相关文章

python爬虫之多线程、多进程、多协程对比

Python爬虫通常需要处理大量的数据和网络请求&#xff0c;因此在爬虫中使用多线程、多进程和多协程可以大大提高爬虫的效率和速度。在本篇文章中&#xff0c;我们将详细介绍Python爬虫中的多线程、多进程和多协程的概念&#xff0c;优缺点以及如何选择合适的方案。 一、多线程…

刷了一个月面试题,终于拿到了字节跳动的offer

前言: 最近金三银四跳槽季&#xff0c;相信很多小伙伴都在面试找工作&#xff0c; 怎样才能拿到大厂的offer&#xff0c;没有掌握绝对的技术&#xff0c;那么就要不断的学习 如何拿下阿里等大厂的offer的呢&#xff0c;今天分享一个秘密武器&#xff0c;资深测试工程师整理的…

Qt 6多媒体(Multimedia)模块变动:重塑与创新

一、Qt 6多媒体模块的转变与升级 Qt 6 是一个有意识地努力使框架更有效和易于使用的结果。尽管我们试图在每个版本中维持所有公共API的二进制和源代码兼容性&#xff0c;但为了使Qt成为一个更好的框架&#xff0c;一些改变是不可避免的。 Qt 6的Qt Multimedia模块替换了Qt 5.…

【chatGPT4结对编程】chatGPT4教我做图像分类

开始接触深度学习 大语言模型火了之后&#xff0c;我也想过是否要加入深度学习的行业当中来&#xff0c;一开始的想法就是AI大模型肯定会被各大厂垄断&#xff0c;我们作为普通应用型软件工程师直接调用api就完事&#xff0c;另外对自己的学历也自卑(刚刚够线的二本&#xff0…

移除元素的两种方法

今日复习了数组部分&#xff0c;对以下题目做了一个整理。 27. 移除元素 这里将不再详细讲述两层for循环的暴力算法。其大致思路是&#xff1a;第一层for循环遍历每一个元素&#xff0c;找到值为val的元素之后&#xff0c;从该位置将每一个元素往前移动一位进行覆盖&#xff1…

ssh无密码链接

ssh的基本语法为 ssh host 然后输入密码才可以 如果a想要免密登录b&#xff0c;则a需要将自己的公钥放在b上&#xff0c;原理如下图&#xff1a; 例如&#xff0c;以aricoder这个用户登录的情况下&#xff0c;在服务器01上生成密钥&#xff0c;命令为 ssh-keygen -t rsa然后连…

python基础知识(三):比较运算符、布尔运算符和位运算

目录 1. 比较运算符2. 布尔运算符3. 位运算 1. 比较运算符 比较运算符通常为以下6种&#xff1a; (1) 大于">“&#xff0c;比较两个数a、b的大小&#xff0c;比较的结果如果a大于b则为True&#xff0c;否则为False&#xff1b; (2) 大于等于”>“&#xff0c;比较…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 9 Recommendation Systems

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 9 Recommendation SystemsRecommendation systems use a number of different technologies. We can classify these systems into two broad groups. Content-based systems examine properties…