[R] cbind和filter函数的坑
2024-09-04 13:13:47
最近我用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)
可见,数据格式的问题不容小觑。而且这种问题如果没报错是很难发现的,这里还是因为结果不合常理才及时返回去查看和改正。
最新文章
- [转载] Java高新技术第一篇:类加载器详解
- tar.xz文件如何解压
- PCH文件配置路径
- (转载)TCP/IP的三次握手与四次挥手
- link
- 161102、MyBatis中批量插入
- [转]就这样,创建了自己的运行时共享库(RSL)
- 一些常用css技巧的为什么(二)我所理解的line-height
- 判断IE版本的HTML语句详解<;!--[if IE]>; <;![endif]-->; - AnswerCard
- 例3.1 猜猜数据结构 UVa11995
- Android 启动过程的底层实现
- Activity的LaunchMode情景思考
- 攻入Javascript,究竟什么是AJAX
- Python中使用hashlib进行加密的简单使用
- HTTPS 站点的性能优化
- 软件测试第二次作业:初识JUNIT单元测试方法
- JavaScript实现文字跑马灯
- Aizu2170 Marked Ancestor(并查集)
- C#GDI+ 绘制线段(实线或虚线)、矩形、字符串、圆、椭圆
- Java并发编程(七)深入剖析ThreadLocal