如何在文件输出中保存不等长度元素的列表

时间:2016-11-24 17:39:35

标签: r list file save

我有一个1000个元素的列表,每个元素由不同长度的其他列表(平均长度约为6000)组成。我需要将其保存为.csv或最好的.txt文件。由于这是一个非常大的对象,我在这里通过一个简单的例子向您展示问题。

给出以下列表列表,其中包含2个列表,这些列表又分别包含4个和6个元素,如下所示:

[[1]]
[[1]][[1]]
[1] 7 3 5 4 8

[[1]][[2]]
[1] 5 7 8

[[1]][[3]]
[1] 1 5

[[1]][[4]]
[1] 6


[[2]]
[[2]][[1]]
[1] 1 7 3 4 5 9

[[2]][[2]]
[1] 5 9 2 1

[[2]][[3]]
[1] 6 2 4

[[2]][[4]]
[1] 6 1

[[2]][[5]]
[1] 5 9

[[2]][[6]]
[1] 6

我需要将此列表列表保存在.csv或最好的.txt文件中,以便维护列表编号的引用,例如前两个数字引用列表顺序,如下所示:

1, 1, 7, 3, 5, 4, 8
1, 2, 5, 7, 8
1, 3, 1, 5                
1, 4, 6

2, 1, 1, 7, 3, 4, 5, 9
2, 2, 5, 9, 2, 1
2, 3, 6, 2, 4
2, 4, 6, 1
2, 5, 5, 9
2, 6, 6

有人知道我该怎么做吗?以下是可重复形式的数据:

mylist <- list(list(c(7, 3, 5, 4, 8), c(5, 7, 8), c(1, 5), 6), list(c(1, 
7, 3, 4, 5, 9), c(5, 9, 2, 1), c(6, 2, 4), c(6, 1), c(5, 9), 
    6))

3 个答案:

答案 0 :(得分:2)

这是一个例子。 (ccat()并非真的有必要,它只是一个帮助功能,可以节省一点点打字。如果您改为使用ccat定义file="",这将打印到改为控制台。)

ccat <- function(...,file="myfile.txt") {
   cat(...,file=file,append=TRUE)                  
}
for (i in seq_along(mylist)) {
    for (j in seq_along(mylist[[i]])) {
        ccat(i,j,mylist[[i]][[j]],sep=", ")
        ccat("\n")
    }
    ccat("\n")
}                                     

答案 1 :(得分:1)

使用嵌套writeLines()来考虑lapply()。下面写入文件并创建相应的newlist对象到内存:

file <- "/path/to/myfile.txt"
conn <- file(description=file, open="w")

newlist <- lapply(seq_len(length(mylist)), function(i){

  lapply(seq_len(length(mylist[[i]])), function(j) {
      temp <- c(i, j, mylist[[i]][[j]])
      writeLines(text=paste(temp, collapse=","), con=conn, sep="\r\n")  
  })

})
close(conn)

答案 2 :(得分:0)

也许是这样的事情 -

mylist <- list(list(c(7, 3, 5, 4, 8), c(5, 7, 8), c(1, 5), 6),
           list(c(1, 7, 3, 4, 5, 9), c(5, 9, 2, 1), c(6, 2, 4), c(6, 1), c(5, 9), 6))

output <- NULL
count <- 1L
output <- plyr::ldply(lapply(mylist, function(x)
           {
            return(cbind(count,seq(x),plyr::ldply(x,rbind)))
            count <<- count + 1
           }))

#Then write the output as a csv file
write.csv(output, file = "output.csv")