2017-01-19 5 views
1

que,targetという名前の2つの異なるインデックスベクトルからなるdata.frameは、3つの個別のdata.frameの間隔データを同時に入力として重複して検索した結果です(3つの間隔セット並行して)。ただし、inputDFは、重複区間を検索した結果です。私はinputDFの次元を減らし、インデックスを再グループ化し、幾何学的に重複するインデックスのペアを示す新しいdata.frameを再構築するなどの特別な方法で、このdata.frameを位置インデックスで構築したいと考えています。 inputDFを操作して私の希望するdata.frameを再構築する方法はありますか?誰も私にこれを簡単に起こらせる方法を教えてもらえますか? inputDFで作業し、目的のdata.frameを構築する効率的な方法はありますか?何か案が?ここposition indexを使ってdata.frameを操作し、目的のデータを再構築する方法は?

間隔配向の視覚化である:私はNAを用い、所望のdata.frameを構築するために

inputDF <- data.frame(
    que=c(5 , 7 , 8 , 9 ,14 ,16, 17 ,20 ,21, 22 , 8 , 9 ,16 ,22 , 2 ,12 ,15 ,18, 
      21 , 4 , 3 , 7 ,15 ,21 ,13 ,19 , 4 , 5 , 6, 13, 14, 19 ,20, 2 , 3 ,12, 
      18 , 6 , 5 ,11, 14, 20 ,8 ,16 ,22 , 9 ,17 , 1, 10 , 1 , 2 , 3, 11,12, 
      18 , 1 ,10), 
    subj=c(5 , 7 , 8, 17 , 5 ,8 ,17 , 5 ,7 ,8, 22 ,22, 22, 22 , 2 ,2 ,15, 2, 
      15 ,4 ,3 ,21 ,21 ,21 ,13 ,13 ,20 ,20 ,20 ,19 ,20 ,19 ,20 ,12 ,12 ,12, 
      12 ,6 ,14 ,11 ,14 ,14 ,16 ,16 ,16 ,9 ,9 ,1 ,1 ,18 ,18 ,18 ,18 ,18, 18 ,10 ,10) 
) 

:ここ

enter image description here

が生じ例data.frameありますsubj_2の重複していない間隔を置き換えます。

これは私の希望data.frameです:

desiredDF <- data.frame(
    que=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22), 
    self.subj=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22), 
    subj_1=c(10,12,12,20,14,20,21,16,17,1,18,12,19,5,21,8,9,12,13,5,7,8), 
    subj_2=c(18,18,18,NA,20,NA,NA,22,22,NA,NA,18,NA,20,NA,22,NA,18,NA,14,15,16) 
) 

編集

例えば、これらは、間隔データとどのように私の希望data.frameが構築されている:

intDF <- list(
    bar=data.frame(start=c(8,18,33,53,69,81,105,115,135), 
        stop=c(14,21,39,61,73,87,111,120,153)), 
    cat=data.frame(start=c(6,15,20,44,71,99,113,141), 
        stop=c(10,17,34,51,78,103,124,147)), 
    foo=data.frame(start=c(11,43,57,101,117), 
        stop=c(36,49,92,109,139)) 
) 

intDF <- bind_rows(intDF) # now it is easier to understand position index, such as `10`,`11` refers to 10th, 11th row in `intDF` and so on. 

que self.sub subj1 subj2 

1 1  10  18 
2 2  12  18 
3 3  12  18 
4 4  20 
5 5  14  20 
6 6  20 
7 7  21 
8 8  16  22 

どのようにすることができます私は私の望むdata.frameを達成する?目的のdata.frameを構築するためにinputDFを操作する効率的な方法はありますか?

+0

を、あなたは常に1と自分自身に等しく、一つだけ' subj'を持っているのですか? – Psidom

+0

@Psidomはい、それがキーポイントです。基本的に 'que'を複製し、' self_subj'という名前に変更することができます。これを実現させるための考え方を教えてください。ありがとうございます:) – Dan

+3

'dcast':' dcast(x [order(que!= subj、que、subj)]、que〜rowid(que、prefix = "subj")) ' – Arun

答えて

3

これはdplyrを使用して行うことができます。

まず、我々はその後、「QUE」に等しくない第一及び第二のSUBJする列を設定し、ソート「SUBJ」で、あなたの「QUE」をGROUPBY:

library(dplyr) 
inputDF %>% 
group_by(que) %>% 
arrange(subj) %>% 
summarise(self.sub = que[1], subj1 = subj[subj!=que][1], subj2 = subj[subj!=que][2]) 

Source: local data frame [22 x 4] 

    que self.sub subj1 subj2 
    (dbl) (dbl) (dbl) (dbl) 
1  1  1 10 18 
2  2  2 12 18 
3  3  3 12 18 
4  4  4 20 NA 
5  5  5 14 20 
6  6  6 20 NA 
7  7  7 21 NA 
8  8  8 16 22 
9  9  9 17 22 
10 10  10  1 NA 
.. ...  ... ... ... 

あなたに応えて編集は、我々はIRangesパッケージを使用することができます。各 `que`について

library(IRanges) 
myranges = IRanges(start = intDF$start, end = intDF$stop) 
data = as.data.frame(findOverlaps(myranges)) 
data 
    queryHits subjectHits 
1   1   10 
2   1   1 
3   1   18 
4   2   18 
5   2   2 
6   2   12 
7   3   18 
8   3   12 
9   3   3 
10   4   4 
...  ...   ... 
+0

親愛なるjeremycgさん、私は 'bind_rows'を使用して単一のDF' intDF'を取得し、重複の検索を進めました。位置のインデックスとの重複間隔の結果として(input index)、数値索引は行を参照します。私のアップデートに基づいて、これはベースRでも同様に起こるのですか?ありがとう:) - – Dan

+1

ベースのRでは編集が可能ですが、IRangesパッケージではもっと簡単です – jeremycg

+0

はい、 'IRanges'パッケージを使用して' inputDF'を取得しますが、 'inputDF'をmyに変更するにはどうすればいいですか希望のもの?それはベースRのソリューションを見ることも可能ですか?どうもありがとうございました :) – Dan

関連する問題