在矩阵中搜索具有任意顺序的给定值的行

时间:2013-05-20 00:27:08

标签: r

我有一个矩阵和一个带值的矢量:

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

有什么想法吗?

1 个答案:

答案 0 :(得分: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