添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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

回到正轨,今天我用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))

数据如下:

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")

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))
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")
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))


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

首发于“生信补给站” ,https://mp.weixin.qq.com/s/l9Ci7wREQWpEV5dTvKuoHg,更多的R统计,绘图,生信,请移步???? 上篇根据 msleep数据集,介绍了列的操作,盘一盘Tidyverse| 筛选列之select,玩转列操作 本文盘一盘筛选 ???? 一 载入R包,数据 #载入R包 #install.packages("tidyverse") libr...
子集的选取——基于tidyverse准备工作1 选取子集1.1 slice :根据特征选取子集1.2 filter :按条件选取子集2. 去除重复3 选取列子集the end (1)安装tidyverse,用于数据处理 install.packages("tidyverse") (2)运用R及相关包库及帮助文件进学习 ?filter # 查看filter帮助文件 ?slice # 查看slice帮助文件 ??select # 查看select帮助文件,
dplyr 包提供了一系列好用的函数,用来进数据处理和转换,掌握之后可以高效解决数据处理的绝大多数问题,我们先来看一下 dplyr 包最核心的 5 个函数。 select: 筛选字段 filter: 按条件过滤 arrange: 按字段排序 mutate: 创建新字段 summarize: 数据汇总 这一章需要使用 gapminder 数据集,该数据集记录了 140 多个国家的人口、寿命、国内生产总值(gdp)等,使用前安装一下 install.packages(‘gapminder’) libra
| 本文首发于 “生信补给站” https://mp.weixin.qq.com/s/tQt0ezYJj3H7x3aWZmKVEQ 使用tidyverse简单的数据处理: 盘一盘Tidyverse| 筛选列之select,玩转列操作 盘一盘Tidyverse| 只要你要只要我有-filter 筛选 Tidyverse|数据列的分分合合,一分多,多合一 Tidyverse| XX_join :多个数据表(文件)之间的各种连接 本次介绍变量汇总以及分组汇总。 一 summarise 汇总 汇总函数 su