【问题标题】:coerce a specific sublist of a list to a matrix / data frame with base R将列表的特定子列表强制转换为具有基数 R 的矩阵/数据框
【发布时间】:2012-05-31 10:59:41
【问题描述】:

我需要从列表的特定子列表创建数据框。我知道这个特定子列表中的数据结构是不变的。对于一个列表,我发现 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, ???) 与其他一些参数会做。我想我需要传递索引或索引函数。有什么帮助吗?

我进行了搜索,但我的搜索词没有运气。应该早就解决了。无论如何,希望你能指导我。谢谢

编辑: 更改了标题,因为我的示例只生成矩阵作为结果。

【问题讨论】:

  • 我不确定我是否遵循。您的示例都没有实际创建数据框。你知道c() 创建的是一个原子向量,而不是一个列表吗?
  • 嗨,我的示例解决方案创建了矩阵 - 类(dat)。你说的对。但是,问题是从 n 个列表元素中创建一个 (n x m) 数据类型结构,每个列表元素包含一个具有 m 个原子元素的列表。也许我的英语不够好,无法正确表达自己。此外,我想我的 R 术语知识水平较低。给您带来的不便,我们深表歉意。
  • 好的,我现在在我的工作中看到了数据框矩阵差异的重点。显然我的示例数据不够准确。因此,我可能应该使用 a

标签: r


【解决方案1】:

如果您知道所需列表组件的名称(在本例中为“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"

但正如 Joran 指出的那样,这不是 data.frame

【讨论】:

  • 是的,我刚刚意识到数据框和矩阵的重点。从我这边看这是不正确的。不过,您和 Andrie 提供的解决方案完成了我预期的工作。我喜欢你对“[[”的看法。谢谢。
【解决方案2】:

这看起来很笨重,但很有效。

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 做一些聪明的事情,但我无法让它发挥作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2020-11-25
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多