如何拼合列表列表?


72

tm包扩展c,使得如果给定一组PlainTextDocument的IT自动创建Corpus。不幸的是,似乎每个都PlainTextDocument必须单独指定。

例如,如果我有:

foolist <- list(a, b, c); # where a,b,c are PlainTextDocument objects

我这样做是为了获得Corpus

foocorpus <- c(foolist[[1]], foolist[[2]], foolist[[3]]);

我有一个的清单'PlainTextDocument,看起来像这样:

> str(sectioned)
List of 154
 $ :List of 6
  ..$ :Classes 'PlainTextDocument', 'TextDocument', 'character'  atomic [1:1] Developing assessment models   Developing models
  .. .. ..- attr(*, "Author")= chr "John Smith"
  .. .. ..- attr(*, "DateTimeStamp")= POSIXlt[1:1], format: "2013-04-30 12:03:49"
  .. .. ..- attr(*, "Description")= chr(0) 
  .. .. ..- attr(*, "Heading")= chr "Research Focus"
  .. .. ..- attr(*, "ID")= chr(0) 
  .. .. ..- attr(*, "Language")= chr(0) 
  .. .. ..- attr(*, "LocalMetaData")=List of 4
  .. .. .. ..$ foo           : chr "bar"
  .. .. .. ..$ classification: chr "Technician"
  .. .. .. ..$ team          : chr ""
  .. .. .. ..$ supervisor    : chr "Bill Jones"
  .. .. ..- attr(*, "Origin")= chr "Smith-John_e.txt"

#etc., all sublists have 6 elements

因此,要将我所有PlainTextDocument的内容都放入Corpus,这将起作用:

sectioned.Corpus <- c(sectioned[[1]][[1]], sectioned[[1]][[2]], ..., sectioned[[154]][[6]])

有人可以建议一种更简单的方法吗?

预计foo<-unlist(foolist, recursive=FALSE)到达时间:产生PlainTextDocuments的平面列表,这仍然使我面临一个问题,即逐个元素地馈送一个列表到c

Answers:


76

我希望这unlist(foolist)会对您有所帮助。它有一个选项recursiveTRUE默认。

因此unlist(foolist, recursive = FALSE)将返回文档列表,然后可以通过以下方式将它们组合:

do.call(c, unlist(foolist, recursive=FALSE))

do.call只是将函数应用于c获得的列表的元素


1
还可以考虑将其NCmisc::Unlist()用于第一级以外的不公开列表。
威震天

25

对于列表多次嵌套且列表元素之间的嵌套量有所不同的情况,这是一个更通用的解决方案:

 flattenlist <- function(x){  
  morelists <- sapply(x, function(xprime) class(xprime)[1]=="list")
  out <- c(x[!morelists], unlist(x[morelists], recursive=FALSE))
  if(sum(morelists)){ 
    Recall(out)
  }else{
    return(out)
  }
}

3
只是为了使它更容易理解,我只是指出,当嵌套对象属于继承类时,使用class(xprime)[1] ==“ list”)标识列表是必要的(而不是使用is.list)从列表中获取(即,注意is.list(data.frame(3))的计算结果为TRUE)
迈克尔

2
还请注意,这并不能保留原始结构的顺序
Michael

迈克尔,您将如何保留原始结构的顺序?
米海

1

这是适用于我的列表列表的另一种方法。

df <- as.data.frame(do.call(rbind, lapply(foolist, as.data.frame)))

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.