2017-01-13 15 views
2

私は、ベクトルの各位置でTRUE/FALSEの組み合わせに基づいて2つの論理名付きベクトルの間の条件を検出したいという状況があります。例えば:私は3つの状態を検出するこれら二つのベクトルの各要素に対して特定の条件に基づいて論理ベクトル要素を選択する

x <- c(TRUE, FALSE, FALSE, TRUE) 
names(x) <- c("a", "b", "c", "d") 
y <- c(TRUE, TRUE, FALSE, FALSE) 
names(y) <- names(x) 

  • x[i]TRUEy[i]TRUEあります。
  • x[i]は、FALSEy[i]TRUEある
  • x[i]
  • TRUEy[i]FALSEあります。

xyの長さは同じですが、この例よりも長くなる可能性があります。私は各条件の要素の名前を取得し、新しい変数に要素名を割り当てる必要があります。この例では:

v1 <- "a" 
v2 <- "b" 
v3 <- "d" 

これら2つのベクトルの長いバージョンで私のようなもので終わるかもしれない:

v1 <- c("a", "e") 
v2 <- c("b", "f", "g") 
v3 <- c("d", "i", "k", "l") 

これを行うための最善のベクトル化の方法は何ですか。私はそれは簡単だと思うが、私は答えを思いつくことができない。前もって感謝します。

答えて

3

splitを効率的に使用できますが、その前に単一のグループ化インデックスが必要です。あなたはTRUEFALSEの4つの組み合わせは、4つの整数値にマップされていることを見ることができるように

x <- c(TRUE, TRUE, FALSE, FALSE) 
y <- c(TRUE, FALSE, TRUE, FALSE) 
x + y + x 
#[1] 3 2 1 0 

:ここでは可能性がある:

g <- x + y + x 
split(names(x), g) 

上記のグループ化インデックスを理解するために、これを考慮してください。

ああ、そう "" T-FT-T、 "B" に割り当てられます、などしかし、なぜx + y + x?私はxを2度追加していません。

だけx + yをすれば、結果は彼らは両方とも1


@thelatemailは多くを提供していますされているとしてあなたがT-FF-Tを区別することはできませんだけで0、1、2です。読みやすい方法:

split(names(x), interaction(x, y, drop=TRUE)) 

更新

ああ...愚かな私...なぜ、私はgの作成を気にしませんでしたか?

split(names(x), list(x, y)) 

注意、内部split.defaultに:

if (is.list(f)) 
    f <- interaction(f, drop = drop, sep = sep) 
+1

ああ、そう "" TTに割り当てられます、 "b" をTFに私は突然、我々はsplitf引数にリストを渡すことができることを覚えておいてくださいしかし、なぜx + y + x?私はxを2回追加することはありません。なるほど、分かりました。これは、4つの状況に対して4つの異なる整数を生成し、論理を整数として使用します。賢い! – Ernie

+0

- 'split(names(x)、interaction(x、y、drop = TRUE))'を助けるインタラクションのもう一つの例は、追加によって 'g'を作るより解釈可能にするかもしれません。 – thelatemail

+0

とてもいいです!両方とも非常にありがとう! – Ernie

関連する問題