我正在尝试使用 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/