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 回答