0

我有一个矩阵A,

A = as.matrix(data.frame(col1 = c(1,1,2,3,1,2), col2 = c(-1,-1,-2,-3,-1,-2), col3 = c(2,6,1,3,2,4)))

我有一个向量 v,

v = c(-1, 2)

如何获得一个 TRUE/FALSE 向量,它比较矩阵的最后两列,如果最后两列与向量匹配则返回 TRUE,否则返回 false?

即,如果我尝试,

A[,c(2:3)] == v

我得到,

           col2  col3
[1,]  TRUE FALSE
[2,] FALSE FALSE
[3,] FALSE FALSE
[4,] FALSE FALSE
[5,]  TRUE FALSE
[6,] FALSE FALSE

这不是我想要的,我希望两列都与向量 v 相同,更像是,

result = c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE)

由于第一行和第五行完全匹配向量 v。

4

4 回答 4

1

这是另一个简单的选择:

which(duplicated(rbind(A[, 2:3], v), fromLast=TRUE))
# [1] 1 5

results <- rep(FALSE, nrow(A))
results[which(duplicated(rbind(A[, 2:3], v), fromLast=TRUE))] <- TRUE
results
# [1]  TRUE FALSE FALSE FALSE  TRUE FALSE

或者,作为一行:

duplicated(rbind(A[, 2:3], v), fromLast=TRUE)[-(nrow(A)+1)]
# [1]  TRUE FALSE FALSE FALSE  TRUE FALSE
于 2013-11-05T17:01:39.180 回答
1

这是一个简单的替代方案

> apply(A[, 2:3], 1, function(x) all(x==v))
[1]  TRUE FALSE FALSE FALSE  TRUE FALSE
于 2013-11-05T16:47:47.360 回答
1

糟糕,通过查看 R 邮件列表,我找到了答案:https ://stat.ethz.ch/pipermail/r-help/2010-September/254096.html ,

check.equal <- function(x, y)
{
  isTRUE(all.equal(y, x, check.attributes=FALSE))
}

result = apply(A[,c(2:3)], 1, check.equal, y=v)

不确定我是否需要定义一个函数并完成所有这些,也许有更简单的方法可以做到这一点。

于 2013-11-05T16:32:00.643 回答
0

一个肮脏的:

result <- c()
for(n in 1:nrow(A)){result[n] <-(sum(A[n,-1]==v)==2)}

> result
[1]  TRUE FALSE FALSE FALSE  TRUE FALSE
于 2013-11-05T16:41:19.740 回答