![](/img/trans.png)
[英]How to create all combinations from a nested list while preserving the structure using 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.