2016-05-10 9 views
3

1つのデータセット内の変数(またはゲノムに沿った位置)が2番目(遺伝子開始/停止位置)の範囲内に収まる2つのデータセットに参加しようとしています。ただし、位置はユニークではなく、追加の列(染色体)内にネストされます。遺伝子開始/停止位置についても同じことが言えます。私の目標は、それぞれの位置を対応する注釈と効果とリンクさせることです。例えばR、ベクター化された範囲内で結合する

library(sqldf) 
set.seed(100) 
a <- data.frame(
    annotation = sample(c("this", "that", "other"), 3, replace=TRUE), 
    start = seq(1, 30, 10), 
    chr = sample(1:3, 3, replace=TRUE) 
) 
a$stop <- a$start + 10 
b <- data.frame(
    chr = sample(1:3, 3, replace=TRUE), 
    position = sample(1:15, 3, replace=TRUE), 
    effect = sample(c("high", "low"), 3, replace=TRUE) 
) 

アンSQL内部ジョインは私が道の一部を取得:

df<-sqldf("SELECT a.start, a.stop, a.annotation, b.effect, b.position 
    FROM a, b 
    inner JOIN a b on(b.position >= a.start and b.position <= a.stop);") 

をしかし、これは染色体あたりの位置の繰り返しを考慮していません。 これをループまたは適用関数にラップするという概念的な問題があります。

私はSQLに執着しているわけではありません。これまでのより簡単な問題に取り組んでいます。また、何千もの染色体値があるので、追加の索引列を作成することが適切であるとは確信していません。

マイ所望の出力は次のようになります各positionchr一致にNAない点を正しいchrstartstop点との間に配置されていない、または与えられた

df$chr<-c("NA","2","2") 
     start stop annotation effect position chr 
1  1 11  this high  3 NA 
2  1 11  this high  10 NA 
3 11 21  this low  14 2 

+0

すみません、私はセットを逃しました。私がコードを再実行したときの種です。 chrカラムは私が何をしているかを示すために追加したダミーデータです。私はあなたの助けに感謝します。 – smm

+0

@smm申し訳ありませんが、私はまだ何が起こっているのか理解していません。望む結果の 'chr'カラムは不思議です。' '$ chr'と' '$ chr''との関係は理解できません。 – eddi

+0

thanks @eddi 'position'、 'start'、 'stop'は 'chr'番号の中にネストされているので、両方のデータセットで共通でなければなりません。 – smm

答えて

2

私は、これはあなたが後にしているものだと思う:

sqldf(
    "Select start, stop, annotation, effect, position, 
    case when a.chr = b.chr then a.chr else NULL end as chr 
    from b left join a 
    on b.position between a.start and a.stop 
    " 
) 
# start stop annotation effect position chr 
# 1  1 11  this high  3 NA 
# 2  1 11  this high  10 NA 
# 3 11 21  this low  14 2  
+1

これはまさに私が後にしたものです。将来の読者のために 'chr'の出力を変更します。それはあなたと@eddiにとって痛いものでしたが、それは私を助けました。私は将来の投稿がテレパシーを必要としないことを確かめます。 – smm

4

data.tabledevelopment versionはを可能に、非エクイのジョイン紹介:

library(data.table) 
setDT(a) # converting to data.table in place 
setDT(b) 

b[a, on = .(position >= start, position <= stop), nomatch = 0, 
    .(start, stop, annotation, effect, x.position, chr = ifelse(i.chr == x.chr, i.chr, NA))] 
# start stop annotation effect x.position chr 
#1:  1 11  this high   3 NA 
#2:  1 11  this high   10 NA 
#3: 11 21  this low   14 2 
+1

それはエキサイティングなdata.tableの開発です! – Gregor

+0

ありがとう@eddi、私は今、私の希望する出力がインコヒーレントであったことを理解しています。これは素晴らしいですが、私は再びdata.tableをチェックアウトします。この質問に時間を割いてくれてありがとう - 私が 'chr'列にサブセットをつけると、この答えが働くでしょう。 – smm

+0

@smm np - 現在のOPと一致するように編集されました – eddi

関連する問題