0

値を持つ行列とベクトルがあります。

mat<-matrix(c(1,1,6,
              3,5,2,
              1,6,5,
              2,2,7,
              8,6,1),nrow=5,ncol=3,byrow=T)

vec<-c(1,6)

これは、N 行 N 列の行列と 1 行 N 列のベクトルの小さなサブセットです。行を vec の値でサブセット化できる方法はありますか?

私が知っている最も簡単な方法は、サブセット関数を使用することです。

subset(mat,vec[,1] == 1 & vec[,2] == 6) #etc etc

サブセットの問題は、検索する列と実行する特定の組み合わせを事前に指定する必要があることです。私が直面している問題は、可能な方法で「vec」の数字を含むすべての行を見つけたいと思うように構成されています。したがって、上記の例では、次の戻り行列を取得したいと考えています。

1,1,6
1,6,5
8,6,1

何か案は?

4

1 に答える 1

1

できるよ

apply(mat, 1, function(x) all(vec %in% x))
#  [1]  TRUE FALSE  TRUE FALSE  TRUE

vecただし、繰り返される値が含まれていると、予期しない結果が生じる可能性があります。

vec <- c(1, 1)
apply(mat, 1, function(x) all(vec %in% x))
# [1]  TRUE FALSE  TRUE FALSE  TRUE

tableしたがって、繰り返しを説明するために、より複雑なものを使用する必要があります。

vec <- c(1, 1)
is.sub.table <- function(table1, table2) {
  all(names(table1) %in% names(table2)) &&
  all(table1 <= table2[names(table1)])
}
apply(mat, 1, function(x)is.sub.table(table(vec), table(x)))
# [1]  TRUE FALSE FALSE FALSE FALSE

ただし、ベクトルの長さがマトリックスの列の数と等しい場合は、示しているように見えますが、例ではそうではありません。次のようにする必要があります。

vec <- c(1, 6, 1)
apply(mat, 1, function(x) all(sort(vec) == sort(x)))
# [1]  TRUE FALSE FALSE FALSE FALSE
于 2013-05-20T00:40:22.287 に答える