打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Reduce函数实现多个数据框批量合并

当单个GEO数据集的挖掘成为红海后,我们常常会整合多个数据集在一起分析。这个过程需要去除批次效应。

批次效应这样矫正

在去除批次效应之前,我们需要把多个数据框合并在一起,今天就是解决的这个问题

假如我们现在需要合并以下三个数据框,

首先,加载数据

  1. load(file = 'df1.Rdata')

  2. load(file = 'df2.Rdata')

  3. load(file = 'df3.Rdata')

每一个数据框的第一列是探针,这个是甲基化数据,所以是甲基化的探针。 

如果行都相同,我们使用cbind函数就可以了,但是这里的行明显不一样,所以需要先统一行名,

我的策略是取出探针名称,用intersect函数两两取交集

然后连着做两次就可以,

  1. index1 <->

  2. index2 <->

最终获得的探针集合长度为

length(index2) 

247986

这时候,我们可以用这个index取提取数据,这样三个数据框的行就统一了, 我喜欢用行名调取数据,比较简单, 所以先用设置行名。

  1. rownames(df1) <->

  2. rownames(df2) <->

  3. rownames(df3) <->

此时,再连续使用两次cbind即可,df2和df3的第一列在合并前要去除

  1. edata <->1])

  2. edata1 <->1])

查看一下维度

  1. > dim(edata1)

  2. [1] 247986    328

打完收工!! 假如我们只会基本的R语言函数,就可以这样实现,很多高级的函数都可以拼接

实际上这个事情是merge这个函数干的,我们只要连续使用两次merge也可以方便地实现以上的效果

  1. edata <->by='probe')

  2. edata2 <->by='probe')

两种方法,效果一样。 

假如,我们现在有6个数据集,也要实现同样的功能,怎么办呢? 

很容易想到lapply,我们以前讲过,重复的操作超过3次,就要写循环了。

神奇的lapply 

读入数据:

  1. files = list.files(pattern='*.Rdata')

  2. fload = lapply(files, function(x) get(load(x)))

然后尝试一下四种方式中的do.call来转换

  1. edata3 <->do.call(merge,fload)

最终发现,merge需要传入两个参数,所以这种方法不能实现,还好,lapply的亲戚Reduce可以解决这个问题。

我知道Reduce这个函数就是上次发了lapply的帖子后,熊给我说的。我当时没有这个需求,就没在意。不过,现在我离不开他了。

以下,一句代码,实现六个数据框的merge合并。

  1. edata4 <->Reduce(function(x,y) merge(x = x, y = y, by = 'probe'),

  2.                 fload)

从此以后,那些需要传入两个参数的函数都可以批量实现,比如,我们一开始的intersect求交集,

Reduce的使用格式是,给出函数,再给出list形式的数据,比如这里的函数是intersect,这里的list是三个数据框的探针名称

  1. index3 <->Reduce(intersect,list(df1$probe,df2$probe,df3$probe))

我们看一下他的长度

length(index3) 

247986

跟前面的一模一样。

最后,大家国庆快乐,有的人两天前就在朋友圈抱怨,说自己根本没有心思上班,心里想的只有给祖国庆生。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
数据挖掘 | TCGA中临床信息大整合
掌握R语言中的apply函数族 | 粉丝日志
Hadoop中的各种排序
R数据分析之merge函数
Pandas高级函数transform使用指南
基础知识 | R语言数据分析之表格处理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服