我有一个如下所示的大型数据集(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中做到这一点?非常感谢您的回复。
答案 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