我想从一个向量创建一个由0和1组成的矩阵,其中每个字符串都包含我希望映射到该矩阵的两个名称。例如,如果我有以下向量
vector_matrix <- c("A_B", "A_C", "B_C", "B_D", "C_D")
我想把它转换成下面的矩阵
A B C D
A 0 1 1 0
B 0 0 1 1
C 0 0 0 1
D 0 0 0 0
我对任何建议都持开放态度,但如果有一些内置函数可以处理它,那就更好了。我正在尝试做一件非常类似的事情,但规模很大,我将生成一个由2500万个细胞组成的矩阵。
如果代码是R,我更喜欢,但如果有一些pythonic解决方案,则不重要:)
编辑:所以当我说"A_B“时,我希望在A行B列中有一个"1”。如果它是相反的(A列B行),这并不重要。
编辑:我想有一个矩阵,它的行名和列名是字母。
发布于 2021-06-28 14:13:45
根据数据创建两列数据帧d,计算级别,然后生成一个列表,其中d的每一列都是一个因子,最后运行表。第二行对每一行进行排序,显示的输入实际上并不需要它,因此可以省略它,但是如果要将B_A视为A_B,则其他数据可能需要它。
d <- read.table(text = vector_matrix, sep = "_")
d[] <- t(apply(d, 1, sort))
tab <- table( lapply(d, factor, levels = levels(factor(unlist(d)))) )
tab
给出这个表:
V2
V1 A B C D
A 0 1 1 0
B 0 0 1 1
C 0 0 0 1
D 0 0 0 0
heatmap(tab[nrow(tab):1, ], NA, NA, col = 2:3, symm = TRUE)
library(igraph)
g <- graph_from_adjacency_matrix(tab, mode = "undirected")
plot(g)
发布于 2021-06-28 14:46:57
下面的代码应该可以在Python中运行。它将输入数据分成两个列表,将字符转换为索引,并将矩阵的索引设置为1。
import numpy as np
vector_matrix = ("A_B", "A_C", "B_C", "B_D", "C_D")
# Split data in two lists
rows, cols = zip(*(s.split("_") for s in vector_matrix))
print(rows, cols)
>>> ('A', 'A', 'B', 'B', 'C') ('B', 'C', 'C', 'D', 'D')
# With inspiration from: https://stackoverflow.com/a/5706787/10603874
row_idxs = np.array([ord(char) - 65 for char in rows])
col_idxs = np.array([ord(char) - 65 for char in cols])
print(row_idxs, col_idxs)
>>> [0 0 1 1 2] [1 2 2 3 3]
n_rows = row_idxs.max() + 1
n_cols = col_idxs.max() + 1
print(n_rows, n_cols)
>>> 3 4
mat = np.zeros((n_rows, n_cols), dtype=int)
mat[row_idxs, col_idxs] = 1
print(mat)
>>>
[[0 1 1 0]
[0 0 1 1]
[0 0 0 1]]
https://stackoverflow.com/questions/68164771
复制