【问题标题】:Using R to create a table from a list while preserving attributes使用 R 从列表中创建表,同时保留属性
【发布时间】:2015-11-18 05:29:20
【问题描述】:

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

等等

【问题讨论】:

  • 您最初的尝试,lapply(ko_nums,keggLink("genes",ko_nums)) 并没有按照您的想法进行;尝试lapply(ko_nums, keggLink, target="genes") 或更好,将ko_nums 拆分成块。如果您需要更多帮助,请让您的示例可重现(通过提供有效ko_nums 的短向量)。
  • 我提供了一个玩具,其中 'ko_nums = c("ko:K00001","ko:K00002","ko:K00003")'。实际上,最初的尝试确实适用于这个子集,返回一个包含三个的列表。我认为这是因为此查询的 url 长度在 R KEGGREST 中是可以接受的。拆分 ko_nums 变量肯定会起作用,但我无法相信没有办法在 R 中保留列表属性以保存在向量或数据框中,正如我在所需的输出中所指出的那样。我尝试使用 'lapply(ko_nums, keggLink, target="genes")',但收到“下标越界”错误消息。

标签: r list bioconductor


【解决方案1】:

将您的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)))

【讨论】:

    猜你喜欢
    • 2019-09-18
    • 2019-12-18
    • 2014-10-17
    • 1970-01-01
    • 2015-03-26
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多