我有一个矩阵和一个带值的矢量:
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
有什么想法吗?
答案 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