2012-05-31 45 views
2

我需要从列表的特定子列表创建数据帧。我知道这个特定子列表中的数据结构是不变的。对于一个列表,我发现do.call()会做的伎俩:将列表的特定子列表强制转换为基于R的矩阵/数据帧

lst<-list(l1="aa", l2="ab", l3="ac") 
fun.sublst1<-function(n) { 
    a<-c("a",1,n) 
    return(a) 
} 
lstoflst<-lapply(lst, fun.sublst1) 
do.call(rbind,lstoflst) # create a data frame from a list 

但是,如果我有一个名单列表,我想遍历一个特定的子表,我不能够使用do.call (rbind,lstoflst $ A)来创建数据框。

# section list of list 
fun.sublst2<-function(n) { 
    a<-c("a",1,n) 
    b<-c("b",2) 
    return(list(A=a,B=b)) 
} 
lstoflst<-lapply(lst, fun.sublst2) 
# result should create a dataframe consisting of all sublists $A 
t(cbind(lstoflst$l1$A,lstoflst$l2$A,lstoflst$l3$A)) 

笨拙的代码看起来就像那样。

dat<-t(as.data.frame(lstoflst[[1]][[1]])) 
for(i in 2:length(lstoflst)) { 
    dat<-rbind(dat,t(lstoflst[[i]][[1]])) 
} 

有没有一个优雅的方式来做到这一点与基地R?我想do.call(rbind,lstoflst,???)和其他一些参数都可以。我想我需要通过索引或索引函数。任何帮助?

我搜索了,但我没有运气与我的搜索字词。可能它已经被解决了。无论如何,希望你能指导我。谢谢

编辑:改变标题,因为我的例子只产生矩阵作为结果。

+0

我不知道我关注。你的例子都没有创建数据框。你知道'c()'创建一个原子向量,而不是一个列表? – joran

+0

嗨,以及我的示例解决方案创建矩阵 - 类(dat)。你是对的。然而,问题是在n个包含m个原子元素的列表的列表元素中创建一个(n x m)数据类型结构。也许我的英语不够好,无法正确表达自己。此外,我认为我的R术语知识水平很低。任何不便敬请谅解。 – Sebastian

+0

好吧,我现在看到我的工作中与数据帧矩阵差异的观点。很显然,我的示例dat不够准确。所以,而不是c()我可能应该使用<-list(V1 =“a”,V2 = 1,V3 = n)。但是,我也可以使用矩阵。感谢您澄清它。 – Sebastian

回答

4

如果你知道你想要的清单组件的名称(在这种情况下,“A”),你可以在列表子集内每个列表:

lsSub <- lapply(lstoflst, "[[", "A") 

,然后rbind

do.call(rbind, lsSub) 
# [,1] [,2] [,3] 
# l1 "a" "1" "aa" 
# l2 "a" "1" "ab" 
# l3 "a" "1" "ac" 

但是,正如乔兰指出的那样,这不是一个data.frame

+0

是的,我刚刚意识到数据框架和矩阵的重点。这在我身边是不正确的。尽管如此,你和安德里提供的解决方案完成了我期望的工作。我喜欢你的观点与“[[”。谢谢。 – Sebastian

+0

+1这非常整齐。 – Andrie

1

这似乎笨重,但工程。

do.call(rbind, 
    lapply(lstoflst, function(x){xx <- x[names(x) %in% "A"]; do.call(rbind, xx)}) 
) 

    [,1] [,2] [,3] 
A "a" "1" "aa" 
A "a" "1" "ab" 
A "a" "1" "ac" 

也许有人可以做一些聪明的东西与rapply,但我无法得到它的工作。