我正在尝试获取一个矩阵,其中重复项的成对组合已被删除。
例如:
m <- cbind(c("A", "B"), c("B", "A"))
由于
BA
是 AB
的重复项,我将其从矩阵中删除
m[!duplicated(t(apply(m, 1, sort))), ]
返回一个向量
"A" "B"
而不是
nrow
为 1 的矩阵。
[,1] [,2]
[1,] "A" "B"
如果我使用
as.matrix(m)
,我会得到
[,1]
[1,] "A"
[2,] "B"
而不是
[,1] [,2]
[1,] "A" "B"
这只发生在
nrow = 1
。如果返回更多行,结果将保留为 matrix
:
m <- cbind(c("A", "B", "A"), c("B", "A", "C"))
m[!duplicated(t(apply(m, 1, sort))), ]
这给出了
[,1] [,2]
[1,] "A" "B"
[2,] "A" "C"
如何获得一个只返回一行的矩阵。上例中只返回向量而不返回矩阵是什么原因?
这是由于
m[!duplicated(t(apply(m, 1, sort))), ]
返回了一个字符。
你可以写一个小函数,比如
f = \(m) {
stopifnot(is.matrix(m))
m = m[!duplicated(t(apply(m, 1, sort))), ]
if(is.character(m)) m = t(as.matrix(m))
m
}
然后做
m = cbind(c("A", "B"), c("B", "A"))
n = cbind(c("A", "B", "A"), c("B", "A", "C"))
lapply(list(m, n), f)
#> [[1]]
#> [,1] [,2]
#> [1,] "A" "B"
#>
#> [[2]]
#> [,1] [,2]
#> [1,] "A" "A"
#> [2,] "B" "C"