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)

行列の最後の 2 列を比較し、最後の 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)

1 行目と 5 行目はベクトル 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

または、1 行で次のようにします。

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

おっと、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 に答える
1

ここに簡単な代替手段があります

> apply(A[, 2:3], 1, function(x) all(x==v))
[1]  TRUE FALSE FALSE FALSE  TRUE FALSE
于 2013-11-05T16:47:47.360 に答える
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 に答える