【发布时间】:2016-10-25 16:25:48
【问题描述】:
我有一个类似于下面的矩阵,但更大。
vec <- c(0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0)
M <- matrix(vec, nrow = 4, byrow = TRUE)
colnames(M) <- rownames(M) <- LETTERS[1:4]
A, B, C, D
A, 0, 1, 1, 0
B, 0, 0, 1, 1
C, 1, 0, 0, 0
D, 0, 1, 1, 0
最终,我想要一个矩阵或一个 data.frame,其中每次连续调用都有一个值,我最终得到一个行名、列名对。所以,给定上面的矩阵,我最终得到下面的矩阵或数据框:
A,B
A,C
B,C
B,D
C,A
D,B
D,C
我可以用循环和 expand.grid 来做到这一点,但这似乎是我应该能够用应用函数来做的事情。例如,我可以像这样到达那里:
tmp <- apply(M, 1, function(x) colnames(M)[which(x > 0)])
这给了我
$A
[1] "B" "C"
$B
[1] "C" "D"
$C
[1] "A"
$D
[1] "B" "C"
如果这很容易,那么我是否也可以将单元格中的数字(对于大于 0 的单元格)作为第三列包含在内?
【问题讨论】: