1

R言語がエレガントな解決策を持っているかもしれないいくつかの質問....

与えられた、バイナリ値1と0を含む行列m、および列インデックスのベクトルv

  1. vの整数でインデックス付けされた各列の値が1であるmのすべての行を抽出する関数を作成するにはどうすればよいですか?
  2. 追加機能として、対応する行とともに行インデックスをどのように返すのでしょうか。

例を挙げて説明すると、おそらく最高です。

私が求めているロジックが関数selectByIndi​​ces(matrix、indexVector)にあると仮定します。

したがって、マトリックス(またはおそらく同等のデータフレーム)がある場合:

 >(m= matrix(c( 1, 0, 1, 1, 1,0, 1, 1, 0, 1,1, 0, 1, 1, 0,1, 1, 1, 
   0, 1,0, 1, 0, 0, 1), 5))

         [,1] [,2] [,3] [,4] [,5]
  [1,]    1    0    1    1    0
  [2,]    0    1    0    1    1
  [3,]    1    1    1    1    0
  [4,]    1    0    1    0    0
  [5,]    1    1    0    1    1

およびインデックスベクトル:

 >c1 = c(1,3,4)
 >c2 =  c(4,5)
 >c3 =  c(1,3,5)

関数は次のように動作します。

 >selectByIndices( m, c1)

        [,1] [,2] [,3] [,4] [,5]
  [1,]    1    0    1    1    0
  [3,]    1    1    1    1    0


 >selectByIndices( m, c2)

        [,1] [,2] [,3] [,4] [,5]
  [2,]    0    1    0    1    1
  [5,]    1    1    0    1    1


 >selectByIndices( m, c3)

    #no rows (i.e. empty collection) returned

それが十分に明確であることを願って、あなたの助けに前もって感謝します。

4

2 に答える 2

2
## Create a function that extracts the qualifying rows
f <- function(m, j) {
    m[rowSums(m[, j]) == length(j),]
    # m[apply(m[, j], 1, function(X) all(X==1)),] ## This would also work
    # which(rowSums(m[, j]) == length(j))         ## & this would get row indices
}

## Try it out
f(m, c1)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    0    1    1    0
# [2,]    1    1    1    1    0

f(m, c2)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    1    0    1    1
# [2,]    1    1    0    1    1
于 2013-01-13T04:58:51.517 に答える
0
> selectRows <- function(mat, rown) suppressWarnings(mat[apply( mat[, rown], 1, all) , ])
> selectRows(m, c1)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    1    0
[2,]    1    1    1    1    0

>  whichRows <-function(mat, rown) suppressWarnings( which( apply( mat[, rown], 1, all) ) )
> whichRows(m, c1)
[1] 1 3
于 2013-01-13T06:52:28.747 に答える