簡體   English   中英

使用 R 從列表創建表,同時保留屬性

[英]Using R to create a table from a list while preserving attributes

我正在嘗試使用 R 創建一個表,將所有 KEGG orthology ID 鏈接到所有相關的 Entrez 基因。 理論上,這可以使用 bioconductor 的 KEGGREST 包來完成。

我有一個所有 KEGG orthology 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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM