我需要从列表的特定子列表创建数据框。我知道这个特定子列表中的数据结构是不变的。对于单个列表,我发现do.call()可以解决这个问题:
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 :(得分: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
答案 1 :(得分: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
做一些聪明的事情,但我无法让它发挥作用。