Dplyr滤波器功能需要运行三次才能消除条件

时间:2018-03-23 15:17:17

标签: r dplyr

我在R中编写了一个qPCR分析脚本,我有一个最奇怪的问题,当我尝试过滤掉“坏基因”时,我必须过滤三次才能删除所有基因。

我的部分分析是确定缺乏足够数据的基因以进行适当的分析,这是通过在技术重复中找到输出较差的引物来完成的。为此,我取输入的xlsx文件并执行以下操作:

dat.group$CT <- as.numeric(dat.group$CT)
dat.group$Ct.SD <- as.numeric(dat.group$Ct.SD)

这会将非数字数据(我认为是“坏数据”)强制转换为NA。然后我做以下事情:

badgenes <- dat.avg$Target.Name[is.na(dat.avg$ct_sd)]
badgenes
[1] "Gad2"  "Pitx3"

有了这个,我尝试现在从我的数据集中删除这些基因如下(dat.avg与dat.group具有相同的名称,它刚被进一步处理,但Target.Name没有改变,我可以如果需要,显示处理):

sum(dat.avg$Target.Name == badgenes)
dat.filt <- filter(dat.avg, Target.Name != badgenes)
sum(dat.filt$Target.Name == badgenes)
dat.filt <- filter(dat.filt, Target.Name != badgenes)
sum(dat.filt$Target.Name == badgenes)
dat.filt <- filter(dat.filt, Target.Name != badgenes)
sum(dat.filt$Target.Name == badgenes)

然而,这个输出是:

[1] 4
[1] 2
[1] 2
[1] 0

使用常规R子集也会发生同样的事情:

sum(dat.avg$Target.Name == badgenes)
dat.filt<-dat.avg[!(dat.avg$Target.Name == badgenes),]
sum(dat.filt$Target.Name == badgenes)
dat.filt<-dat.filt[!(dat.filt$Target.Name == badgenes),]
sum(dat.filt$Target.Name == badgenes)
dat.filt<-dat.filt[!(dat.filt$Target.Name == badgenes),]
sum(dat.filt$Target.Name == badgenes)

,并提供:

[1] 4
[1] 2
[1] 2
[1] 0

我知道只是通过多次过滤问题是“固定的”,但我想知道为什么这个问题甚至发生,因为它似乎对我没有多大意义。

提前致谢!

> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] bindrcpp_0.2    xlsx_0.5.7      xlsxjars_0.6.1  rJava_0.9-9     forcats_0.2.0   stringr_1.2.0   dplyr_0.7.4     purrr_0.2.4     readr_1.1.1     tidyr_0.7.2     tibble_1.3.4   
[12] ggplot2_2.2.1   tidyverse_1.2.1

loaded via a namespace (and not attached):
 [1] reshape2_1.4.3   haven_1.1.0      lattice_0.20-35  colorspace_1.3-2 htmltools_0.3.6  yaml_2.1.16      rlang_0.1.4      foreign_0.8-69   glue_1.2.0       modelr_0.1.1    
[11] readxl_1.0.0     bindr_0.1        plyr_1.8.4       munsell_0.4.3    gtable_0.2.0     cellranger_1.1.0 rvest_0.3.2      evaluate_0.10.1  psych_1.7.8      labeling_0.3    
[21] knitr_1.20       parallel_3.4.1   broom_0.4.3      Rcpp_0.12.14     backports_1.1.2  scales_0.5.0     jsonlite_1.5     mnormt_1.5-5     hms_0.4.0        digest_0.6.13   
[31] stringi_1.1.6    grid_3.4.1       rprojroot_1.2    cli_1.0.0        tools_3.4.1      magrittr_1.5     lazyeval_0.2.1   crayon_1.3.4     pkgconfig_2.0.1  xml2_1.1.1      
[41] lubridate_1.7.1  assertthat_0.2.0 rmarkdown_1.9    httr_1.3.1       rstudioapi_0.7   R6_2.2.2         nlme_3.1-131     compiler_3.4.1  

2 个答案:

答案 0 :(得分:1)

在Seymour的回答基础上,如果你做了很多这样的事情,你可以创建一个自定义%!in%函数并使用它来过滤。

`%!in%` <- Negate(`%in%`)
dat.filt <- filter(dat.avg, Target.Name %!in% badgenes)

答案 1 :(得分:0)

如果您分享一个可重复性最小的示例,那就太好了。

然而,诀窍是%in%

dat.filt <- filter(dat.avg, !(Target.Name %in% badgenes))

考虑到您只想保留那些不在向量badgenes中的元素,您只需将!放在括号之前:!(Target.Name %in% badgenes)