3

非常に単純な計算を実行するために 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 プログラマーではないということです。したがって、これが適切な解決策であることが判明したとしても、他の人がどのように解決するのか非常に興味があります。

助けてくれてありがとう。

4

1 に答える 1

7
 matrix( m2[ match(m1, rownames(m2) )], ncol=2)
     [,1] [,2]
[1,]    0    0
[2,]    0    0
[3,]    1    1
[4,]    0    1

m3 <- matrix(m2[match(m1, rownames(m2) )], ncol=2)

 which( m3[,1]==0 & m3[,2]==1 )
#[1] 4

  m3[,1]==0 & m3[,2]==1 
# [1] FALSE FALSE FALSE  TRUE
于 2013-03-28T22:40:53.830 に答える