使用R根据其他数据集选择数据

时间:2013-08-09 23:58:40

标签: r

我有一个如下所示的大型数据集(d1):

SNP Position    Chromosome
rs1 10010   1
rs2 10020   1
rs3 10030   1
rs4 10040   1
rs5 10010   2
rs6 10020   2
rs7 10030   2
rs8 10040   2
rs9 10010   3
rs10 10020  3
rs11 10030  3
rs12 10040  3

我还有一个如下所示的数据集(d2):

SNP Position    Chromosome
rsA 10015   1    
rsB 10035   3

现在,我想根据d2(位置+ -5和同一染色体)在d1中选择一系列SNP,并将结果写入txt文件,结果应如下所示:

SNP(d2) SNP(d1) Position(d1)    Chromosome
rsA rs2 10020   1
rsA rs3 10030   1
rsB rs11    10030   3
rsB rs12    10040   3 

我是R的新人,有谁能告诉我如何在R中做到这一点?非常感谢您的回复。

2 个答案:

答案 0 :(得分:3)

通过“Chromosome”列进行合并(比如在该列的数据库中连接2个表):

mrg <- merge(x = d1, y = d2, by = c("Chromosome"), all.y = TRUE)

然后过滤位置diff&lt; = 5:

的行
result <- mrg[abs(mrg$Position.x - mrg$Position.y) <= 5,]

会给你想要的结果。

答案 1 :(得分:1)

d2$low <- d2$Position-5 ; d2$high<- d2$Position+5

你可能认为你可以做一些像:

d2$matched <- which(d1$Position >=d2$low & d2$high >= d1$Position)

....但不是真的,所以你需要一些更多的参与。:

 d1$matched <- apply(d1, 1, function(p) 
                            which(p['Position'] >=d2[,'low'] & 
                                  d2[,'high'] >= p['Position'] & 
                                  p['Chromosome']==d2[,"Chromosome"]) )

基本上这是检查d1的每一行是否在范围内的d2和相同的染色体上存在潜在的匹配:

 d1        # take a look
 # Then bind matching cases together
 cbind( d1[ which(d1$matched > 0), ], 
        d2[ unlist(d1$matched[which(d1$matched>0)]), ] )
#--------------------
    SNP Position Chromosome matched SNP Position Chromosome   low  high
1   rs1    10010          1       1 rsA    10015          1 10010 10020
2   rs2    10020          1       1 rsA    10015          1 10010 10020
11 rs11    10030          3       2 rsB    10035          3 10030 10040
12 rs12    10040          3       2 rsB    10035          3 10030 10040