gpt4 book ai didi

r - 在 R 中使用 apply 将矩阵转换为配对列表?

转载 作者:行者123 更新时间:2023-12-04 16:58:34 24 4
gpt4 key购买 nike

我有一个类似于下面的矩阵,但更大。

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 的单元格)作为第三列包含在内吗?

最佳答案

igraph方法

library(igraph)  
as_data_frame(graph_from_adjacency_matrix(M, weighted = TRUE))
graph_from_adjacency_matrix()将矩阵作为输入并返回一个图形。使用 weighted=TRUE将非零值作为权重返回。 as_data_frame返回带有关联属性的边列表(在本例中为权重)

所以对于你的例子,
as_data_frame(graph_from_adjacency_matrix(M, weighted = TRUE))
# from to weight
# 1 A B 1
# 2 A C 1
# 3 B C 1
# 4 B D 1
# 5 C A 1
# 6 D B 1
# 7 D C 1

关于r - 在 R 中使用 apply 将矩阵转换为配对列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40245084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com