2016-08-03 7 views
0

私は3つのdata.tableを持っていますが、それぞれが正方形のグリッドでペアになる必要があります。私はグリッドスクエアの上下の三角形の上を歩きたいだけです。私はこれはJavaのような他のプログラミング言語では単純なビットだと思っていますが、Rでそれを作る方法はわかりません。誰もこれを簡単にやっていることを知っていますか?私は効率的にグリッドオブジェクトを作成するために、適切な方法を見つけることができなかったので、私はおおよそアウトピン 対角線上にある上下の三角形のペアのdata.tableを取得する方法は?

grid <- matrix((a,a), (a,b), (a,c), 
       (b,a), (b,b), (b,c), 
       (c,a), (c,b), (c,c),3,3) 

データ

mylist <- list(
    a <- data.table(
    start=seq(1, by=9, len=10), stop=seq(6, by=9, len=10), 
    ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)), 
    b <- data.table(
    start=seq(2, by=11, len=10), stop=seq(8, by=11, len=10), 
    ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)), 
    c <- data.table(
    start=seq(4, by=11, len=10), stop=seq(9, by=11, len=10), 
    ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)) 
) 

正方形グリッド内のすべての可能な対(I手動DID)グリッドを手動で作成します。

所望の出力:

グリッドオブジェクトは、マトリックスまたはいくつかの他の表現とすることができます。これはスクラッチコードです。ここで、get.ovlpが上記のグリッド表現を返しますが、重複したペアが繰り返されたと想像してください。私の目的は、唯一の唯一の

library(data.table) 
mylist <- list(a,b,c) 
get.ovlp <- function(set, idx=1L) { 
    que <- set[[idx]] 
    supp <- lapply(set[-idx], function(ele_) { 
    ans <- data.table::foverlaps(que, ele_) 
    }) 
    return(supp) 
} 

get.ovlp機能が繰り返さどのペアの重なりを表現グリッドオブジェクトのように起こっていることだけでおもちゃの例であるsqureグリッドの三角形の下/上段の上を歩くことで、これらの繰り返しペアを削除しています。

私は四角いグリッドの上から下三角(対角線を含む)のペアを歩いて、data.tableパッケージのfoverlaps関数を使用します。誰でもこの問題を効率的に解決するための考え方を提案できますか?ありがとうございました

+1

ラインは有効ではありませんし、エラーを生成します。 '各データテーブルをペアにする 'とはどういう意味ですか? – nicola

+0

@nicola:適切なグリッドオブジェクトを効率的に構築するための適切な方法が見つかりませんでした。したがって、私はちょうど私のグリッドオブジェクトがどのように手動で表されます。 – datageek

+1

'a'、' b'、 'c'は' data.table'です。各要素に2つの 'data.table'が含まれている3x3行列が必要ですか?なぜこれが欲しいのですか?あなたは 'foverlaps'を使いたいと言っています。どのように説明できますか? 'grid'の要素だけの出力を表示できますか? – nicola

答えて

1

あなたが正しく理解していれば、mylistにある要素のペアに関数を適用したいと思います。 ("a", "b")。リスト名の>=操作はもう「意味のある」でない場合には名前ので( :

require(data.table) 

# your data (I named the elements a, b, and c) 
mylist <- list(a = data.table(start=seq(1, by=9, len=10), stop=seq(6, by=9, len=10), 
           ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)), 
       b = data.table(start=seq(2, by=11, len=10), stop=seq(8, by=11, len=10), 
           ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)), 
       c = data.table(start=seq(4, by=11, len=10), stop=seq(9, by=11, len=10), 
           ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE))) 


# build pairs on upper triangle 
# utilise fact that >= is meaningful for characters 
dt_idx = CJ(i = names(mylist), j = names(mylist))[j >= i] 

# apply function (here merge) by i, j: 
dt_idx[, 
     j = merge(x = mylist[[i]], y = mylist[[j]], by = c('start', 'stop', 'ID')), 
     by = list(i, j)] 

注:あなたは、たとえば、これを(私は関数の一例としてmergeを使用)行うことができます注文および/またはより複雑な)あなたはいつもintegerインデックスを使用することができ、その後、同じロジックを適用していない... `grid`オブジェクトを構築するための

dt_idx = CJ(i = seq.int(length(mylist)), j = seq.int(length(mylist)))[j >= i] 
+0

私は上記のグリッドオブジェクトは繰り返しペアを含むことを想像してみましょう、例えば、setdiff(a、b)はsetdiff(b、a)と同じです。グリッドの正方形の三角形、新しいグリッドで繰り返されるペアのない繰り返し。 – datageek

+1

はい、 'dt_idx'にはそれらの"重複 "が含まれていません(ご注文を考慮しない場合) – sbstn

+0

同じ論理をdata.frameのような他のオブジェクトに拡張すればCJ関数には対応する代替が必要ですか? – datageek

関連する問題