【问题标题】:Recursive access to elements in list of lists in R递归访问R中列表列表中的元素
【发布时间】:2013-03-06 14:17:26
【问题描述】:

我正在使用 R 的 Annotation 包来获取与某些基因相关的 GO 术语。使用 getGOParents(term) 函数的结果是:

> x = getGOParents("GO:0035556")

$`GO:0035556`
$`GO:0035556`$Ontology
[1] "BP"

$`GO:0035556`$Parents
    is_a 
"GO:0007165" 

列表的结构是:

dput(x)
structure(list(`GO:0035556` = structure(list(Ontology = "BP", 
Parents = structure("GO:0007165", .Names = "is_a")), .Names = c("Ontology", 
"Parents"))), .Names = "GO:0035556")

我需要访问列表的“最后一个”项,我以非常愚蠢的方式做到了:

y=x[1]
z=y[[1]]
w=z[[2]]
s=w[[1]]

有没有办法以编程方式访问它?

【问题讨论】:

  • 您能否在您的列表中添加一个dput,因为从您粘贴的内容中很难看出它的结构。并且也请描述一下你最终想要得到的价值……

标签: r list nested-lists


【解决方案1】:

您可以使用rapply,它是 lapply 的递归版本。在这里,我在您列表的终端节点上应用身份功能。

 rapply(x,f=I)
GO:0035556.Ontology GO:0035556.Parents.is_a 
               "BP"            "GO:0007165"

或者一个一个访问

rapply(x,f=I)[2] 
GO:0035556.Parents.is_a 
       "GO:0007165" 

【讨论】:

    【解决方案2】:

    我为此使用了这个功能:

    getParent <- function(x){
        parent = NA
        if(exists(x,revmap(GOBPCHILDREN))){
            parents = get(x,revmap(GOBPCHILDREN))
            parent = tail(parents, n=1)
        }
        if(!is.na(parent)){
            return(parent)
        }
        return(NA)
    }
    

    但我不想要最高的父母,因为这一位总是一样的。所以我把函数改成:

    getParent <- function(x){
        parent = NA
        if(exists(x,revmap(GOBPCHILDREN))){
            parents = get(x,revmap(GOBPCHILDREN))
            parent = tail(parents, n=4)[1] ##change the 4 to which level you want
        }
        if(!is.na(parent)){
            return(parent)
        }
        return(NA)
    }
    

    GO 术语的一个很好的可视化工具是 GOrilla:http://cbl-gorilla.cs.technion.ac.il/

    我希望你能用这些信息做点什么

    【讨论】:

    • 我刚刚复制了你的函数并尝试使用 x=GO:0004726,它给了我 NA 虽然它有几个祖先 (amigo.geneontology.org/cgi-bin/amigo/…)
    • @Lazza87 这只是 BP (Biological Process) 你的 GO ID 包含一个 MF (Molecular Function),所以把 GOBPCHILDREN 改成 GOMFCHILDREN。
    • 现在它似乎可以工作了,但是参数 n 是该方法应该返回的祖先数量吗?因为使用 n=4 它只返回“第一个”父母
    • @Lazza87 n=4 返回一个父级,它仍然有 3 个父级,因此您不要选择顶层,它始终是您正在使用的类型(BP、CC 或 MF)。当你想要一个更低的孩子时,你可以使用 n=。如果你想要所有的父母,你必须删除 [1]。
    【解决方案3】:

    请注意,您可以将方法压缩为

    x[[1]][[2]][[1]]
    

    您可以做的一件事是使用 unlist 删除列表结构

    unlist(x)
    #GO:0035556.Ontology GO:0035556.Parents.is_a 
    #               "BP"            "GO:0007165" 
    

    您可以通过索引单独访问它们

    > unlist(x)[1]
    GO:0035556.Ontology 
                   "BP" 
    > unlist(x)[2]
    GO:0035556.Parents.is_a 
               "GO:0007165" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2014-09-24
      • 2020-05-24
      • 2015-03-24
      • 2017-07-31
      相关资源
      最近更新 更多