我在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
答案 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)