数据处理——两文件快速对接

数据处理——两文件快速对接

    本文提供源代码和文件,以及提供思路。需要学习的可以自己先动手试试效率如何,效率不行的话,再根据伪代码自己写程序,最后在参考代码(暂时测试是没有问题的),数据集经过删减供测试用,下载网址:http://pan.baidu.com/s/1bnpYFEJ 密码:5czv。其实,在excel中也可以使用vlookup函数完成数据对接,不过excel有个限制就是数据集不能太大。

实例一:多条件下两文件对接

1.问题提出

数据集CpG_density格式(共4498577行)如下:

这儿只列举了前几行,第一列染色体号(当然还有其他染色体的,这儿看到的只有一号染色体),第二列染色体位置,第三列正反链,第四列cpg密度。

 

数据集temp格式(共3765995行)如下:


    注意1列为染色体号,2、3两列为基因位置。

 

需要的结果如下:


    暂且把temp表作为我们的目标表,可增加几列,目的是把CpG_density表的cpg密度那一列放入到新增加的列中,temp表中的染色体号为条件一,条件二为位置有两个基因位置为Star和End,达到任意一个即可(且已知不会出现同时达到的情况出现)。

 

2.解决方案

伪代码:使用循环——temp表中逐行循环,在CpG_density表中查找符合条件一下,再符合条件二中的其中一个,读取数据放入temp表中,终止进入下一行。

效率评估:CpG_density表行数)的temp表行数的次方

优化一:挑取染色体号后进行逐行循环,省掉很多时间。

优化二:挑取染色体号,然后挑取temp表含有的位点,进行逐行循环,省掉更多时间。

。。。。。。

 

3.实际解决方案

    伪代码:目标表temp多生成两列,CpG_density表多生产一列,生成的列的作用就是把两个条件甚至是多个条件进行合并后放入,减少不需要的判断和循环。

如下:temp表


CpG_density


最后使用R软件中match函数就瞬间搞定了,你会发现你自己写循环没有使用这个函数的速度快,原因如下:R软件的表层循环是比内部循环慢的,内部循环应该是使用其他的语言如C或Fortran写的。

结果:

 

源代码:


    上边的好看却不方便复制粘贴

setwd('g:/')

CpG_density =read.table('CpG_density_individual_chr1_2_test.txt',header=T)

temp<-read.csv('pre_1_O_Z_test.csv',header=T)[,-1]

temp$pos<-rep(NA,nrow(temp));temp$CpG_density<-rep(NA,nrow(temp))

temp$chr_start<-paste(temp[,1],"_",temp[,2],sep="");

temp$chr_end<-paste(temp[,1],"_",temp[,3],sep="")

 

CpG_density = CpG_density[,c(1:4,4)]

names(CpG_density)[5] = 'chr_site'

CpG_density[,5] =paste(CpG_density[,1],"_",CpG_density[,2],sep="")

 

temp[,c(8,9)] = CpG_density[match(temp[,10],CpG_density[,5]),c(2,4)]

temp[which(is.na(temp[,8])),c(8,9)] =CpG_density[match(temp[which(is.na(temp[,8])),11],CpG_density[,5]),c(2,4)]

 

write.table(……)


 

实例二:多条件整数范围内数据对接

   1.问题提出

数据集tiles_CpGs格式(共4478909行)如下:

这儿只列举了前几行,第一列染色体号(当然还有其他染色体的,这儿看到的只有一号染色体),第二列染色体开始位置,第三列染色体结束位置,第四列区域cpg密度。

 

数据集temp格式(共3765995行)如下:


    注意1列为染色体号,2、3两列为基因位置。

 

需要的结果如下:

暂且把temp表作为我们的目标表,可增加几列,目的是把tiles_CpGs表的区域cpg密度那一列放入到新增加的列中,temp表中的染色体号为条件一,条件二为染色体的开始位置Star在tiles_CpGs表的区域,这儿不在考虑结束位置。例如:下边的1号染色体103就需要把1号染色的100-200区域的cpg密度提取出来放入。

 

2.解决方案

伪代码:使用循环——temp表中逐行循环,在tiles_CpGs表中查找符合条件一染色体号,再符合条件二三,即大于star小于end,读取数据放入temp表中,终止进入下一行。

效率评估:我已经不知道怎么去评估了,太慢了。

优化一:挑取染色体号后进行逐行循环,省掉很多时间,依然无法实现。

优化二:想不到了。。。。。。

 

3.实际解决方案

伪代码:其实在这里很容易陷入先比对染色体号,然后根据范围进行比较大小的误区,其实只要好好注意一下就会发现范围这儿是有规律,都是100为一段的,既然有这个的规律那么我们就按照这个规律进行操作了。

首先,先看下temp这个表,第一行的103,要么变成101要么变成200,是不是就好办多了,然后直接和tiles_CpGs表中101或200比较就行了,然后再来看看处理成含有***1容易还是处理成***00容易了,很明显处理成后边这种形式容易的。问题变成了要想变成200整数怎么处理了?好像没有直接往上约的函数,那就得自己想办法了,比如:加上一个整数(恰好有这么一个整数99,和那个间距有关)后,去掉后面两位数(有多种方法:1,除于100去小数部分再乘以100;2,直接用字符串截取前面几位)。当时第一行的1号染色体的103实际处理成了这样chr1_2,后边两个零也舍弃了因为没有什么用。

其次,tiles_CpGs表中也添加一列,处理成同样形式chr1_2。

最后,直接使用match函数进行操作就行了,毫无压力。

如下:temp表

 


tiles_CpGs

 

结果:


源代码:

 

 

上边的好看却不方便复制粘贴

setwd('g:/')

tiles_CpGs =read.table('CpG_density_tiles_chr1_2_test.txt',header=T)

temp<-read.csv('pre_1_O_Z_test.csv',header=T)[,-1]

 

temp$tiles_chr<-rep(NA,nrow(temp));

temp$tiles_start<-rep(NA,nrow(temp));

temp$tiles_end<-rep(NA,nrow(temp));

temp$tiles_CpGs<-rep(NA,nrow(temp));

temp$tiles<-paste(temp[,1],"_",trunc((temp[,2]+99)*0.01),sep="")

tiles_CpGs$tile<-paste(tiles_CpGs[,1],"_",trunc(tiles_CpGs[,3]*0.01),sep="")

temp[,c(8:11)] = tiles_CpGs[match(temp[,12],tiles_CpGs[,5]),1:4]

write.table(……)


 

实例三:双不规则范围内数据如何对接

这是我一直在思考没有得到很好答案的问题,现在准备接着上面的思路,看看能不能把它拿下。

内含子和lncRNA,基因和lncRNA,他们既可以A包含B,也可能B包含A,甚至就是交叉一部分,囧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值