我有一个包含特定基因的文件列表,我想在R中创建一个二进制关系矩阵,以显示每个文件中每个基因的存在。
例如,这是我的文件aaa
,bbb
,ccc
和ddd
以及与它们相关的基因。
aaa=c("HERC1")
bbb=c("MYO9A", "PKHD1L1", "PQLC2", "SLC7A2")
ccc=c("HERC1")
ddd=c("MACC1","PKHD1L1")
我想知道我可以在R中使用哪个命令来生成一个二进制关系表,如下图所示:
其中值1表示关联,而值0表示不关联。
如何在R中执行此操作?
我尝试使用table(aaa,bbb,ccc,ddd)
,但是没有用。 R说:
表中的错误(aaa,bbb,ccc,ddd):所有参数都必须具有 相同长度
编辑:感谢@akrun的有用答复!我将利用这个问题为另一个问题寻求帮助,我相信你们可以很快处理。对于分析的第二部分,我需要生成另一个表,其中,对于每对基因,如果两个基因都存在于特定文件中,则将其分配为1,否则将其分配为0。按照我之前给出的示例,此新表应类似于以下表(为澄清起见,将其移置了该表):
有人从您已经提供给我的命令开始,有人知道在R中获取此新的双基因表的快速方法吗?谢谢!
答案 0 :(得分:2)
一种选择是获取命名为list
(mget
)中的对象标识符的值,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
应用于两列而不是多个对象