打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于R语言filter处理NA达不到理想效果最后选择%in%的记录--标题就是这么硬核--以后还是经常更新博客吧毕竟分享就是学到

大家好,我是邓飞,好久没有更新博客了,是因为好久没有进步了。今天记录一下使用filter的坑,坑很深,不好爬,所以写一篇博客分享一下,希望对还没有遇到过的小伙伴起到警示的作用,你要记得:有一个坑在不远处等你,掉进去的时候知道如何爬上来……

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

所以,我决定还是经常分享博客,毕竟输出才能倒逼输入。内心的OS:我还年轻,不能吃老本,我还有很多东西要学习,机器学习、神经网络、生物信息、统计……,有很多小伙伴,把问题抛给我,让我写篇教程,毕竟,我写的教程都是面向小白的,毕竟,未经小白苦,休道小白菜,有时候,入门,只差一篇博客,这也是我的目标。所以,还没有将公众号标星的小伙伴,标星走起来呀:

写到这里,发现有4363个朋友关注我,说明公众号粉丝中有1/6都是我的好友,还没有加好友互秀朋友圈的点击这里:

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

数据如下:

> df
   ID 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%才是靠谱的!!!

想要更好的学习和交流,快来加入飞哥的知识星球,这是一个生物统计+数量遗传学+GWAS+GS的社区,在这里你可以向飞哥提问、帮你指定学习计划、跟着飞哥一起做实战项目,冲冲冲。点击这里加入吧:飞哥的学习圈子

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
R数据分析之merge函数
一个参数一个Excel表,让你玩转Pandas中read_excel()表格读取!
使用Pandas读取复杂Excel表单
关于在python中如何使用pandas库读取excel表格后 删除含有空值的列
Python3操作excel的集大成者pandas
UC头条:PythonExcel文件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服