保存和加载data.frames [重复]

Posted

技术标签:

【中文标题】保存和加载data.frames [重复]【英文标题】:Saving and loading data.frames [duplicate] 【发布时间】:2012-11-03 07:02:22 【问题描述】:

我根据一组推特制作了一个数据框,格式如下:

 rdmTweets <- userTimeline("rdatamining", n=200)
 df <- do.call("rbind", lapply(rdmTweets, as.data.frame))

现在我以这种方式保存数据框:

 save(df, file="data")

如何加载已保存的数据框以供将来使用?当我使用时:

  df2 <- load("data")

我申请dim(df2) 它应该返回数据框拥有的推文数量,但它只显示1。

【问题讨论】:

【参考方案1】:

正如@mrdwab 指出的那样,save 保存名称以及数据/结构(实际上可以在单个文件中保存许多不同的 R 对象)。还有另一对存储函数的行为更符合您的预期。试试这个:

saveRDS(df, file="mytweets.rds")
df2 <- readRDS("mytweets.rds")

这些函数一次只能处理一个对象。

【讨论】:

我记得今年早些时候读过 Gavin Simpson 的一篇文章。 Here it is。 +1 提醒! 那篇文章也是我第一次了解这些功能的方式。 +1 用于序列化。我更喜欢这种方法而不是加载整个工作区。它更受控制。 @seancarmody, loadRDS 对我不起作用。而是readRDS 很好。 (我是win7用户)【参考方案2】:

另一种选择是将数据框保存为 csv 文件。此选项的好处是它提供了长期存储,即您将(很可能)能够在十年后在任何平台上打开您的 csv 文件。对于RData 文件,您只能使用 R 打开它,我不想在版本之间打开它。

要将文件保存为 csv,只需使用:read.csvwrite.csv,因此:

write.csv(df, file="out.csv", row.name=FALSE)
df = read.csv("out.csv", header=TRUE)

Gavin 下面的评论提出了几点:

CSV 路由仅适用于表格样式的数据。

完全正确。但是,如果您要保存一个数据框(就像 OP 一样),那么您的数据就是表格形式。

使用 R,您将始终拥有 启动旧版本以读取数据并导出的能力 出于某种原因,他们更改了保存格式并且不允许旧格式 由另一个函数加载。

要扮演魔鬼的拥护者,您可以将此参数与 Excel 一起使用,并将您的数据保存为 xls。但是,将数据保存为 csv 格式意味着我们无需担心这一点。

R 的文件格式已记录在案,因此可以相当容易地 使用该开放信息读取另一个系统中的二进制数据。

我完全同意——尽管“轻松”有点强。这就是为什么保存为 RData 文件并不是什么大问题。 但是如果您要保存表格数据,为什么不使用 csv 文件呢?

为了记录,将表格数据保存为 RData 文件有一些原因。例如文件的读写速度或文件大小。

【讨论】:

虽然这是一个很好的概括点,并且 R 在某些时候已经更改了一次 IIRC 的格式,但使用 R,您将始终能够启动旧版本来读取数据并导出出于某种原因,他们更改了保存格式,并且不允许其他函数加载旧格式。 CSV 路由也仅适用于表格样式的数据。最后,记录了 R 的文件格式,因此人们可以使用该开放信息相当容易地读取另一个系统中的二进制数据。 @GavinSimpson 好评。我觉得我强调的风险有点过分了。我已经更新了我的答案。干杯【参考方案3】:

save 保存数据集的名称以及数据。因此,您不应该为load("data") 指定名称,您应该没问题。换句话说,只需使用:

load("data")

它会将一个名为 df 的对象(或文件“data”中包含的任何内容)加载到您当前的工作区中。

不过,我建议您为文件取一个更原始的名称,并考虑添加一个扩展名来帮助您记住脚本文件是什么、数据文件是什么等等。


通过这个简单的例子你自己的方式:

rm(list = ls())              # Remove everything from your current workspace
ls()                         # Anything there? Nope.
# character(0)
a <- 1:10                    # Create an object "a"
save(a, file="myData.Rdata") # Save object "a"
ls()                         # Anything there? Yep.
# [1] "a"
rm(a)                        # Remove "a" from your workspace
ls()                         # Anything there? Nope.
# character(0)
load("myData.Rdata")         # Load your "myData.Rdata" file
ls()                         # Anything there? Yep. Object "a".
# [1] "a"
str(a)                       # Is "a" what we expect it to be? Yep.
#  int [1:10] 1 2 3 4 5 6 7 8 9 10
a2 <- load("myData.Rdata")   # What about your approach?
ls()                         # Now we have 2 objects
# [1] "a"  "a2"
str(a2)                      # "a2" stores the object names from your data file.
#  chr "a"

如您所见,save 允许您一次保存和加载多个对象,这在处理需要保存在一起的多组数据的项目时非常方便。

另一方面,saveRDS(来自the accepted answer)只允许您保存单个对象。在某些方面,这更“透明”,因为 load() doesn't let you preview the contents of the file 没有先加载它。

【讨论】:

以上是关于保存和加载data.frames [重复]的主要内容,如果未能解决你的问题,请参考以下文章

保存和加载data.frames

在过滤R data.frames时更新因子水平[重复]

R - 子集列表data.frames由矢量值

通过循环多个Data.frames /无法保存

使用 R 将列表的元素保存为 data.frames

从 KeyChain 保存和加载 |斯威夫特 [重复]