我有一個矩陣:
A<-t(matrix(
c(0, 0, 1,
0, 0, 0,
0, 0, 1,
0, 0, 1,
0, 0, 0,
1, 1, 0), 3, 6))
我需要保留只出現一次的列。因此,預期的結果只是第 3 列:(1, 0, 1, 1, 0, 0)。
我找到了唯一和重復的功能,但我需要更強大的功能來洗掉所有出現多次的列(在我的示例中為第 1 和第 2)。
uj5u.com熱心網友回復:
看起來我們需要一個 double duplicated。
A[, !(duplicated(t(A)) | duplicated(t(A), fromLast = TRUE)), drop = FALSE]
[,1]
[1,] 1
[2,] 0
[3,] 1
[4,] 1
[5,] 0
[6,] 0
這個想法也適用于向量。
x <- c(1, 1, 2, 3, 4, 3, 4, 5)
x[!(duplicated(x) | duplicated(x, fromLast = TRUE))]
[1] 2 5
uj5u.com熱心網友回復:
我們可以嘗試使用下面的基本 R 代碼aggregate來總結A列的唯一性資訊
with(
aggregate(
. ~ id,
data.frame(id = c(col(A)), val = c(A)),
toString
),
A[, ave(id, val, FUN = length) == 1, drop = FALSE]
)
或等效地
A[
,
with(
aggregate(
. ~ id,
data.frame(id = c(col(A)), val = c(A)),
toString
),
ave(id, val, FUN = length) == 1
),
drop = FALSE
]
這使
[,1]
[1,] 1
[2,] 0
[3,] 1
[4,] 1
[5,] 0
[6,] 0
uj5u.com熱心網友回復:
另一種可能的解決方案:
A[,apply(sapply(which(duplicated(A, MARGIN = 2)),
\(x) sapply(1:ncol(A), \(y) all(A[,x] == A[,y]))), 1, \(z) all(!z)), drop = F]
#> [,1]
#> [1,] 1
#> [2,] 0
#> [3,] 1
#> [4,] 1
#> [5,] 0
#> [6,] 0
或者:
A[,colSums(outer(which(duplicated(A, MARGIN = 2)), 1:ncol(A),
Vectorize(\(x, y) all(A[,x] == A[,y])))) == 0, drop = F]
#> [,1]
#> [1,] 1
#> [2,] 0
#> [3,] 1
#> [4,] 1
#> [5,] 0
#> [6,] 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/498170.html
下一篇:while回圈是否存盤中間結果?
