从矩阵中提取特定元素

Extract specific elements from matrix

假设我有一个矩阵

x <- matrix(c(0, 1, 1,
              1, 0, 0,
              0, 1, 0), byrow = TRUE, nrow = 3, 
            dimnames = list(c("a", "b", "c"), c("a", "b", "c")))

我现在需要两个向量(或者更好的是 data.frame 中的拖列),第一个 vector/column 保存列名,第二个向量保存 [=] 中所有元素的行名12=] 即 1.

所以在我的例子中我想得到这个

v1 <- c("a", "b", "b", "c")
v2 <- c("b", "a", "c", "a")

对于 20 x 20 矩阵,最快最优雅的方法是什么。

您可以使用参数 arr.ind 其中:

indices <- which(x==1, arr.ind=TRUE)
#  row col
#b   2   1
#a   1   2
#c   3   2
#a   1   3

然后您可以将 row/column 索引替换为名称:

v1 <- rownames(x)[indices[, "row"]]
v2 <- colnames(x)[indices[, "col"]]

和另一个使用 rowcolumn 函数的解决方案:

ind <- (x == 1)
colnames(x)[col(x)[ind]]
#[1] "a" "b" "b" "c"
rownames(x)[row(x)[ind]]
#[1] "b" "a" "c" "a"

关于两种方法的速度,Cath 和我的:

cath <- function(){
  x <- matrix(0, ncol = 20, nrow = 20, dimnames = list(letters[1 : 
 20], letters[1 : 20]))
  x[sample(20 * 20, rpois(1, 50))] <- 1
  indices <- which(x == 1, arr.ind = TRUE)
  list(v1 = rownames(x)[indices[, "row"]], v2 = colnames(x)[indices[, 
"col"]])
}


stas <- function(){
   x <- matrix(0, ncol = 20, nrow = 20, dimnames = list(letters[1 : 20], letters[1 : 20]))
   x[sample(20 * 20, rpois(1, 50))] <- 1
   ind <- (x == 1)
   list(v1 = colnames(x)[col(x)[ind]], v2 = rownames(x)[row(x)[ind]])
}

microbenchmark(cath, stas, times = 1000L)
# Unit: nanoseconds
# expr min lq   mean median uq  max neval
# cath  45 54 77.855   56.0 57 9718  1000
# stas  45 56 61.457   57.5 59 1831  1000

Cath 的平均速度稍快。