• [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)
    

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

  • 相关阅读:
    偏函数 匿名函数 高阶函数 map filter reduce
    函数
    Python的字符串格式化
    集合
    列表 元组 字典
    字符串
    数字
    Python基础-杂项
    Java 和C/C++的“语法”上的差异!
    MySQL基础原创笔记(一)
  • 原文地址:https://www.cnblogs.com/jessepeng/p/11443878.html
Copyright © 2020-2023  润新知