首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从R或python中的字符串向量创建0和1的矩阵

从R或python中的字符串向量创建0和1的矩阵
EN

Stack Overflow用户
提问于 2021-06-28 22:04:19
回答 2查看 64关注 0票数 1

我想从一个向量创建一个由0和1组成的矩阵,其中每个字符串都包含我希望映射到该矩阵的两个名称。例如,如果我有以下向量

代码语言:javascript
代码运行次数:0
运行
复制
vector_matrix <- c("A_B", "A_C", "B_C", "B_D", "C_D")

我想把它转换成下面的矩阵

代码语言:javascript
代码运行次数:0
运行
复制
  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行),这并不重要。

编辑:我想有一个矩阵,它的行名和列名是字母。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-28 22:13:45

根据数据创建两列数据帧d,计算级别,然后生成一个列表,其中d的每一列都是一个因子,最后运行表。第二行对每一行进行排序,显示的输入实际上并不需要它,因此可以省略它,但是如果要将B_A视为A_B,则其他数据可能需要它。

代码语言:javascript
代码运行次数:0
运行
复制
d <- read.table(text = vector_matrix, sep = "_")
d[] <- t(apply(d, 1, sort))
tab <- table( lapply(d, factor, levels = levels(factor(unlist(d)))) )
tab

给出这个表:

代码语言:javascript
代码运行次数:0
运行
复制
   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)

代码语言:javascript
代码运行次数:0
运行
复制
library(igraph)
g <- graph_from_adjacency_matrix(tab, mode = "undirected")
plot(g)

票数 3
EN

Stack Overflow用户

发布于 2021-06-28 22:46:57

下面的代码应该可以在Python中运行。它将输入数据分成两个列表,将字符转换为索引,并将矩阵的索引设置为1。

代码语言:javascript
代码运行次数:0
运行
复制
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]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68164771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档