如何在文件输出中保存不等长元素的列表
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 中重用它,你可以使用saveRDS
和 readRDS
我在您的帖子中添加了可重现的数据。下次请使用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实战技巧之两个不等长列表让里面的数字一一对应地相加