R,如何从字符串列表创建二进制关系矩阵?

时间:2019-05-15 18:35:28

标签: r matrix contingency

我有一个包含特定基因的文件列表,我想在R中创建一个二进制关系矩阵,以显示每个文件中每个基因的存在。

例如,这是我的文件aaabbbcccddd以及与它们相关的基因。

aaa=c("HERC1")
bbb=c("MYO9A", "PKHD1L1", "PQLC2", "SLC7A2")
ccc=c("HERC1")
ddd=c("MACC1","PKHD1L1")

我想知道我可以在R中使用哪个命令来生成一个二进制关系表,如下图所示:

enter image description here

其中值1表示关联,而值0表示不关联。

如何在R中执行此操作?

我尝试使用table(aaa,bbb,ccc,ddd),但是没有用。 R说:

  

表中的错误(aaa,bbb,ccc,ddd):所有参数都必须具有   相同长度

编辑:感谢@akrun的有用答复!我将利用这个问题为另一个问题寻求帮助,我相信你们可以很快处理。对于分析的第二部分,我需要生成另一个表,其中,对于每对基因,如果两个基因都存在于特定文件中,则将其分配为1,否则将其分配为0。按照我之前给出的示例,此新表应类似于以下表(为澄清起见,将其移置了该表):

enter image description here

有人从您已经提供给我的命令开始,有人知道在R中获取此新的双基因表的快速方法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

一种选择是获取命名为listmget)中的对象标识符的值,stack将其获取到两列data.frame,并使用{ {1}}

table

或带有table(stack( mget(strrep(letters[1:4], 3)))[2:1]) # values #ind HERC1 MACC1 MYO9A PKHD1L1 PQLC2 SLC7A2 # aaa 1 0 0 0 0 0 # bbb 0 0 1 1 1 1 # ccc 1 0 0 0 0 0 # ddd 0 1 0 1 0 0 的选项

tidyverse

使用OP的代码

library(tidyverse)
lst(aaa, bbb, ccc, ddd) %>% 
  enframe %>% 
  unnest %>% 
  count(name, value) %>% 
  spread(value, n, fill = 0)
# A tibble: 4 x 7
#  name  HERC1 MACC1 MYO9A PKHD1L1 PQLC2 SLC7A2
#  <chr> <dbl> <dbl> <dbl>   <dbl> <dbl>  <dbl>
#1 aaa       1     0     0       0     0      0
#2 bbb       0     0     1       1     1      1
#3 ccc       1     0     0       0     0      0
#4 ddd       0     1     0       1     0      0

table(aaa,bbb,ccc,ddd) 中的length必须相同,vector才能正常工作。另外,如果我们使用两个以上的向量,则频率表将是多维的(> 2D)。因此,我们需要一个框架,将table应用于两列而不是多个对象