[R] cbind和filter函数的坑

最近我用cbind函数整合数据后,再用filter过滤数据,碰到了一个大坑。

以两组独立样本t检验筛选差异蛋白为例进行说明吧。

pro2 <- df2[1:6]
Pvalue<-c(rep(0,nrow(pro2))) 
log2_FC<-c(rep(0,nrow(pro2)))  

for(i in 1:nrow(pro2)){
  if(sd(pro2[i,1:3],na.rm = T)==0 && sd(pro2[i,4:6],na.rm = T)==0){
    #两组的标准差都等于0时,将无法进行t检验
    Pvalue[i] <- "NA"
    log2_FC[i]<- "NA" 
  }else{
    y=t.test(as.numeric(pro2[i,1:3]),as.numeric(pro2[i,4:6]))
    Pvalue[i]<-y$p.value
    log2_FC[i]<-log2((mean(as.numeric(pro2[i,1:3]),na.rm = T)+0.001)/(mean(as.numeric(pro2[i,4:6]),na.rm = T)+0.001))
  }
}
fdr=p.adjust(Pvalue, "BH") 
proTtest<-cbind.data.frame(ID=rownames(pro2),pro2,log2_FC,Pvalue,fdr,stringsAsFactors = FALSE) 

pro_up <- proTtest %>% filter(log2_FC>=0.58,Pvalue<0.05) #1.5倍
pro_down <- proTtest %>% filter(log2_FC<=-0.58,Pvalue<0.05)

首先,有一点我还是清楚的,就是rbind/cbind函数合并数据框时,会将加入的字符串类型强制转换为因子类型。所以我记得转换,只用cbind.data.frame函数其实也是不行的,必须加入stringsAsFactors = FALSE参数。

但是筛选的结果是上调只有5个,下调的有上千个。我马上意识到肯定是代码出现了问题,检查了很久才发现还是数据格式的问题!

我虽然对因子进行了转换,但转化后仍是字符型,而filter对字符型筛选很明显和数字不同。

所以加了以下几行进行转换,结果应该没问题了。

str(proTtest)
proTtest$log2_FC <- as.numeric(proTtest$log2_FC)  #一定要转换
proTtest$fdr <- as.numeric(proTtest$fdr)

可见,数据格式的问题不容小觑。而且这种问题如果没报错是很难发现的,这里还是因为结果不合常理才及时返回去查看和改正。

posted @ 2019-09-01 21:57  生物信息与育种  阅读(981)  评论(0编辑  收藏  举报