R,如何从字符串列表创建二元关系矩阵?
R, how to create a binary relation matrix from a list of strings?
我有一个包含特定基因的文件列表,我想在 R 中创建一个二进制关系矩阵,以显示每个文件中每个基因的存在。
例如,这是我的文件 aaa
、bbb
、ccc
和 ddd
以及与它们相关的基因。
aaa=c("HERC1")
bbb=c("MYO9A", "PKHD1L1", "PQLC2", "SLC7A2")
ccc=c("HERC1")
ddd=c("MACC1","PKHD1L1")
我想知道我可以在 R 中使用哪个命令来生成二元关系 table,如下图所示:
其中值1表示关联,值0表示不关联。
如何在 R 中执行此操作?
我尝试使用 table(aaa,bbb,ccc,ddd)
但它没有用。 R 说:
Error in table(aaa, bbb, ccc, ddd) : all arguments must have the
same length
编辑:感谢@akrun 的有用回复!我会利用这个问题来为 另一个问题 寻求帮助,我相信你们可以很快处理。对于我分析的第二部分,我需要生成另一个 table ,其中 对于每对基因,如果它们都存在于特定文件中,我分配值 1,其他为 0明智。按照我之前给出的示例,这个新的 table 应该如下所示(我将其转置以澄清):
有谁知道从你们已经提供给我的命令开始在 R 中获得这个新的生物基因 table 的快速方法吗?谢谢!
一个选项是获取命名 list
(mget
) 中的对象标识符的值,stack
它到两列 data.frame 并获取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
的选项
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
在 OP 的代码中
table(aaa,bbb,ccc,ddd)
vector
的 length
需要相同才能使 table
工作。此外,如果我们使用超过 2 个向量,频率 table 将是 multi-dimensional (> 2D)。因此,我们需要一个框架来将 table
应用于两列而不是多个对象
我有一个包含特定基因的文件列表,我想在 R 中创建一个二进制关系矩阵,以显示每个文件中每个基因的存在。
例如,这是我的文件 aaa
、bbb
、ccc
和 ddd
以及与它们相关的基因。
aaa=c("HERC1")
bbb=c("MYO9A", "PKHD1L1", "PQLC2", "SLC7A2")
ccc=c("HERC1")
ddd=c("MACC1","PKHD1L1")
我想知道我可以在 R 中使用哪个命令来生成二元关系 table,如下图所示:
其中值1表示关联,值0表示不关联。
如何在 R 中执行此操作?
我尝试使用 table(aaa,bbb,ccc,ddd)
但它没有用。 R 说:
Error in table(aaa, bbb, ccc, ddd) : all arguments must have the same length
编辑:感谢@akrun 的有用回复!我会利用这个问题来为 另一个问题 寻求帮助,我相信你们可以很快处理。对于我分析的第二部分,我需要生成另一个 table ,其中 对于每对基因,如果它们都存在于特定文件中,我分配值 1,其他为 0明智。按照我之前给出的示例,这个新的 table 应该如下所示(我将其转置以澄清):
有谁知道从你们已经提供给我的命令开始在 R 中获得这个新的生物基因 table 的快速方法吗?谢谢!
一个选项是获取命名 list
(mget
) 中的对象标识符的值,stack
它到两列 data.frame 并获取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
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
在 OP 的代码中
table(aaa,bbb,ccc,ddd)
vector
的 length
需要相同才能使 table
工作。此外,如果我们使用超过 2 个向量,频率 table 将是 multi-dimensional (> 2D)。因此,我们需要一个框架来将 table
应用于两列而不是多个对象