27

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

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

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

 save(df, file="data")

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

  df2 <- load("data")

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

4

3 回答 3

45

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

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

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

于 2012-11-03T08:13:58.703 回答
13

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

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

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

加文在下面的评论提出了几点:

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

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

使用 R,如果由于某种原因它们更改了保存格式并且不允许旧格式由另一个函数加载,您将始终能够启动旧版本来读取数据和导出。

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

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

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

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

于 2012-11-03T09:23:45.573 回答
10

save保存数据集的名称以及数据。因此,你不应该给它分配一个名字,你应该没load("data")问题。换句话说,只需使用:

load("data")

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

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


完成这个简单的例子:

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(从接受的答案)只允许您保存单个对象。在某些方面,这更“透明”,因为load()不允许您在不先加载文件的情况下预览文件的内容。

于 2012-11-03T07:06:24.373 回答