r - 使用 R 从列表创建表,同时保留属性

标签 r list bioconductor

我正在尝试使用 R 创建一个表,将所有 KEGG 直系同源 ID 链接到所有相关的 Entrez 基因。理论上,这可以使用 bioconductor 的 KEGGREST 包来完成。

我有一个所有 KEGG 直系同源 ID ko_nums 的列表,我想使用函数 keggConv 将其转换为 Entrez ID。首先我尝试 lapply,但这是一个问题,因为 url 查询太长:

 library(KEGGREST)
 lapply(ko_nums,keggLink("genes",ko_nums))
 Error in .get Url: (414) Request-URI Too Long

所以这不适用于像我这样大的查询。我尝试使用以下方法扩展列表并一次查询一个:

 output = apply(expand.grid(ko_nums),1,
              function(x,y) keggLink("genes",x[1]))

但是如果你用一个玩具来做到这一点

 ko_nums = c("ko:K00001","ko:K00002","ko:K00003")
 output = apply(expand.grid(ko_nums),1,
              function(x,y) keggLink("genes",x[1]))
 output

您会看到我的输出是一个包含三个的列表,列表中每个直系同源 ID 有许多基因。我想将每个基因与其各自的直系同源编号配对在数据表中,但是 a) 将其包装在“unlist”函数中会删除所有 ko 标识符,并且 b)我无法用列表创建数据框,因为每行都有不同数量的元素。

有没有办法从此列表中制作一个两列表,其中 ko 编号被分成单独的直系/基因对?像这样:

 ko:K00001     gene_1
 ko:k00001     gene_2
 ko:K00001     gene_3
 ko:K00002     gene_4
 ko:K00002     gene_5
 ko:K00002     gene_6

等等

最佳答案

将长长的 ko_nums 列表拆分为 n=1000 标识符组(选择 n 以便 URL 不会太长)长)

n = 1000
k = length(ko_nums)
grp = floor((1:k - 1) / n)
ko_groups = split(ko_nums, grp)

keggLink() 应用于每个组

res = lapply(ko_groups, keggLink, target="genes")

将结果组合成所需的结果

df = data.frame(ko_num=unlist(sapply(res, names)),
                value = unname(unlist(res)))

关于r - 使用 R 从列表创建表,同时保留属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33693603/

相关文章:

python - 对同时包含字符串和整数的列表进行排序 (Python)

r - R中热图/聚类默认值的差异(热图与热图.2)?

r - 使用 R 将表写入文件会导致不需要的行名称列

r - 将长度不均匀的列表向量转换为矩阵

regex - 正则表达式选择逗号但不在括号之间

c++ - 如何比较两个充满类的 STL 列表

r - 如何使用 mapply 复制嵌套 for 循环?

r - 在没有互联网的情况下安装 Bioconductor

r - 使用 dplyr 中的整数范围

css - 在 RMarkdown 中更改 block 背景颜色