递归访问R中列表列表中的元素

时间:2013-03-06 14:17:27

标签: r list nested-lists

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

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

3 个答案:

答案 0 :(得分:0)

您可以使用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" 

答案 1 :(得分:0)

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

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" 

答案 2 :(得分:0)

我使用了这个功能:

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/

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