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

Posted

技术标签:

【中文标题】如何在文件输出中保存不等长元素的列表【英文标题】:How to save in a file output a list of unequal length elements 【发布时间】:2016-11-24 17:39:35 【问题描述】:

我有一个包含 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))

【问题讨论】:

如果你只在 R 中重用它,你可以使用 saveRDSreadRDS 我在您的帖子中添加了可重现的数据。下次请使用dput 函数的结果以可重现的形式创建您的数据。 我不清楚“CSV 还是最好是文本” - 鉴于您上面建议的格式,这两种文件类型之间唯一真正的区别是扩展名(即文件名,而不是其内容) 【参考方案1】:

这是一个例子。 (ccat() 并不是真正需要的,它只是一个帮助函数来节省一点输入。如果你用file="" 定义ccat,这将打印到控制台。)

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")
                                     

【讨论】:

我不明白函数'ccat'的参数是什么,是否必须在两个for循环之前声明。 文件输出为空。 猫叫需要append=TRUE吗?【参考方案2】:

考虑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)

【讨论】:

写调用需要append=TRUE吗? 原谅我,@42 但我没有收到错误/警告并且文本文件正确生成。【参考方案3】:

也许是这样的-

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")

【讨论】:

以上是关于如何在文件输出中保存不等长元素的列表的主要内容,如果未能解决你的问题,请参考以下文章

python实战技巧之两个列表实例中,如何让里面的数字一一对应地相加对于两个列表是等长的情况

python中numpy.ndarray怎么删除指定下标的元素

python实战技巧之两个不等长列表让里面的数字一一对应地相加

给定一个字符串s和一个由多个等长字符串组成的列表words,输出列表中的字符串组成的整体在s中的所有可能的位置

如何获取 R Shiny 中所有输出元素的列表

如何保存列表中的特定元素?