我需要从列表的特定子列表创建数据帧。我知道这个特定子列表中的数据结构是不变的。对于一个列表,我发现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,???)和其他一些参数都可以。我想我需要通过索引或索引函数。任何帮助?
我搜索了,但我没有运气与我的搜索字词。可能它已经被解决了。无论如何,希望你能指导我。谢谢
编辑:改变标题,因为我的例子只产生矩阵作为结果。
我不知道我关注。你的例子都没有创建数据框。你知道'c()'创建一个原子向量,而不是一个列表? – joran
嗨,以及我的示例解决方案创建矩阵 - 类(dat)。你是对的。然而,问题是在n个包含m个原子元素的列表的列表元素中创建一个(n x m)数据类型结构。也许我的英语不够好,无法正确表达自己。此外,我认为我的R术语知识水平很低。任何不便敬请谅解。 – Sebastian
好吧,我现在看到我的工作中与数据帧矩阵差异的观点。很显然,我的示例dat不够准确。所以,而不是c()我可能应该使用<-list(V1 =“a”,V2 = 1,V3 = n)。但是,我也可以使用矩阵。感谢您澄清它。 – Sebastian