假设我有一个矩阵
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中甚至更好的拖曳列),第一个向量/列保存着列名,第二个向量保存了x
中所有元素为1的行名
所以在我的示例中,我想得到这个
v1 <- c("a", "b", "b", "c")
v2 <- c("b", "a", "c", "a")
对于20 x 20的矩阵,最快,最优雅的方法是什么。
答案 0 :(得分:5)
您可以为此使用参数arr.ind
:
indices <- which(x==1, arr.ind=TRUE)
# row col
#b 2 1
#a 1 2
#c 3 2
#a 1 3
然后,您可以将行/列索引替换为名称:
v1 <- rownames(x)[indices[, "row"]]
v2 <- colnames(x)[indices[, "col"]]
答案 1 :(得分:2)
以及使用row
和column
函数的另一个解决方案:
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
平均来说,洗个澡要快一点。