非常に単純な計算を実行するために R で 2 つの行列を一致させることについて質問があります。私は作業コード (以下) を持っていますが、それを行うには、より効率的で「R に似た」方法が必要だと感じています。手がかりは大歓迎です。
問題
関連情報を含む2つのマトリックスがあります。m1 にはたくさんの参照が含まれています。m2 には、これらの参照 (ゼロまたは 1) に関するデータが含まれています。m2 からデータを検索したときに、m1 のどの行が最初の列に「0」があり、2 番目の列に「1」があるかを知りたいです。おもちゃの例を次に示します。
> m1 <- matrix(data = c(51,52,53,51,54,55,56,57), nrow = 4, ncol = 2)
> m1
[,1] [,2]
[1,] 51 54
[2,] 52 55
[3,] 53 56
[4,] 51 57
> m2 <- matrix(data = c(0,0,1,0,0,1,1), nrow = 7, ncol = 1)
> rownames(m2) <- c(51,52,53,54,55,56,57)
> m2
[,1]
51 0
52 0
53 1
54 0
55 0
56 1
57 1
一般的な特性は、m1 のすべてのエントリが対応する行名を m2 に持っていることを既に保証できることです。これは、はるかに大きな行列に対して何百万回も行う必要があるため、速度が重要です。
私がやりたいことは、m2 を使用して、m1 のどの行が最初の列にゼロを持ち、2 番目の列に 1 があるかを把握することです。この場合、m1 の最後の行のみがそのプロパティを持ちます。
私の解決策
これには、apply() を使用する比較的問題のない解決策があり、それほど悪くはありません。
> is.zero.one <- function(line, m2){
+ start = m2[as.character(line[1]),]
+ end = m2[as.character(line[2]),]
+ if(start==0 && end==1){return(TRUE)}
+ else{return(FALSE)}
+}
> apply(m1, 1, is.zero.one, m2)
[1] FALSE FALSE FALSE TRUE
これはうまくいきます。でもゴツい感じです。
私の質問
これを行うためのよりスマート/高速/より自然な方法を知っている人はいますか? match() と関連する関数を見てみましたが、解決策が思いつきませんでした。ここで関連する質問を検索するための同上。私の質問の理由の 1 つは、私があまり優れた R プログラマーではないということです。したがって、これが適切な解決策であることが判明したとしても、他の人がどのように解決するのか非常に興味があります。
助けてくれてありがとう。