2016-06-01 19 views
0

次の例では:Rに複数列の値のベクトルを比較data.table

DT <- data.table(A1=c(1,2),A2=c(2,3),B1=c(1,2),B2=c(3,4),B3=c(2,5)) 

IカラムA1およびA2の値が両方B1、B2又はB3のいずれかで起こるかどうかを行ごとにチェックします。

私が行う場合:

DT[,BOTH_PRESENT:=!(F %in% (c(A1,A2) %in% c(B1,B2,B3)))] 

この利回りを:

A1 A2 B1 B2 B3 BOTH_PRESENT 
1: 1 2 1 3 2   TRUE 
2: 2 3 2 4 5   TRUE 

私は2番目の行のための第一の行のTrueとFalse期待するだろうが

# Row 1 
!(F %in% (c(1,2) %in% c(1,3,2))) 
# Row 2 
!(F %in% (c(2,3) %in% c(2,4,5))) 

コードを変更するにはどうすればよいですか?

私の実際のデータセットは、列の面ではるかに大きいので、(A1 == B1 | A1 == B2 | A1 == B3) & (A2 == B1 | A2 == B2 | A2 == B3)のような表現はすばらしい解決策にはなりません。

+0

なぜdownvote?あなたがそうしたらフィードバックを提供してください。 –

+3

私は最終的に解決策が実際にはかなり効率的だと思います。列数が多い場合は、式をプログラムで作成する必要があります。 – Roland

+0

よろしくお願いします。 –

答えて

2

我々はdata.tableの行の順序でグループ、unlist「A」、列は、allこれらの要素は、%in%unlist ED「B」の列であるかどうかを確認することができます。

DT[, BOTH_PRESENT := all(unlist(.SD[, 1:2, with = FALSE]) %in% 
     unlist(.SD[, 3:5, with = FALSE])), by = 1:nrow(DT)] 

それとも@Rolandが述べたように

DT[,BOTH_PRESENT:= all(c(A1, A2) %in% c(B1,B2,B3)), by = seq_len(nrow(DT))] 
+3

またはDT =、BOTH_PRESENT:=すべて%c(B1、B2、B3)のすべてのc(A1、A2)%、by = seq_len(nrow(DT ))] '。ボットは、これが行を繰り返すループであることに注意してください。これは遅いかもしれません。 – Roland

+0

ありがとう、実際には、集計メジャーを計算するためにA1とA2でグループ化しながらこのチェックを実行する必要がありますが、私はちょうどそれを行うためにあなたのコードを書き換えることができると思います –

+0

恐ろしい!ありがとうございます、魅力のように動作します。私は@Rolandの解答(より読みやすい)を好む。 –

関連する問題