【问题标题】:Combine multiple .RData files containing objects with the same name into one single .RData file将包含同名对象的多个 .RData 文件合并为一个 .RData 文件
【发布时间】:2013-01-23 08:08:35
【问题描述】:

我有许多 .RData 文件,其中包含我在之前的分析中保存的一个数据框,并且该数据框对于每个加载的文件具有相同的名称。因此,例如使用 load(file1.RData) 我得到一个名为“df”的数据框,然后使用 load(file2.RData) 我得到一个同名的数据框“df”。我想知道是否有可能将所有这些 .RData 文件合并到一个大的 .RData 文件中,因为我需要一次加载它们,每个 df 的名称等于文件名,这样我就可以使用不同的数据帧。

我可以使用下面的代码做到这一点,但它非常复杂,必须有更简单的方法来做到这一点......谢谢你的建议。

假设我有 3 个 .RData 文件,并希望将所有文件保存在一个名为“main.RData”的文件中,并使用它们的特定名称(现在它们都以“df”的形式出现):

all.files = c("/Users/fra/file1.RData", "/Users/fra/file2.RData", "/Users/fra/file3.RData")
assign(gsub("/Users/fra/", "", all.files[1]), local(get(load(all.files[1]))))
rm(list= ls()[!(ls() %in% (ls(pattern = "file")))])
save.image(file="main.RData")


all.files = all.files = c("/Users/fra/file1.RData", "/Users/fra/file2.RData", "/Users/fra/file3.RData")

for (f in all.files[-1]) {
  assign(gsub("/Users/fra/", "", f), local(get(load(f))))
  rm(list= ls()[!(ls() %in% (ls(pattern = "file")))])
  save.image(file="main.RData")
}

【问题讨论】:

  • 你有没有更好的方法来阅读几个 .RData 文件?

标签: r storage


【解决方案1】:

这是一个包含多个现有帖子的选项

all.files = c("file1.RData", "file2.RData", "file3.RData")

将多个数据帧读入一个命名列表 (How can I load an object into a variable name that I specify from an R data file?)

mylist<- lapply(all.files, function(x) {
  load(file = x)
  get(ls()[ls()!= "filename"])
})

names(mylist) <- all.files #Note, the names here don't have to match the filenames

您可以保存列表,或在保存之前将数据帧传输到全局环境中 (Unlist a list of dataframes)

list2env(mylist ,.GlobalEnv)

或者,如果数据框相同并且您想创建一个大数据框,您可以折叠列表并添加一个带有贡献文件名称的变量 (Dataframes in a list; adding a new variable with name of dataframe)。

all <- do.call("rbind", mylist)
all$id <- rep(all.files, sapply(mylist, nrow))

【讨论】:

    【解决方案2】:

    我认为我看到的最佳答案是下面的代码,我从一个我现在无法追踪的 SO 答案中复制了该代码。向原作者致歉。

    resave <- function(..., list = character(), file) {
       previous  <- load(file)
       var.names <- c(list, as.character(substitute(list(...)))[-1L])
       for (var in var.names) assign(var, get(var, envir = parent.frame()))
       save(list = unique(c(previous, var.names)), file = file)
    }
    #I took advantage of the fact the load function 
    #returns the name of the loaded variables, so 
    #I could use the function's environment instead of creating one.
    #And when using get, I was careful to only look in the 
    #environment from which the function is called, i.e. parent.frame()
    

    【讨论】:

    • 谢谢卡尔。我想这可以通过指定一个初始保存的 .RData 文件并将其他 R 对象添加到该文件中来工作,但我认为要将其应用于我的案例,我需要将这个函数依次应用于每个 .RData 文件,每次加载 .RData 文件,更改对象的名称,以便我知道数据框来自哪个文件(我的所有 .RData 文件都加载具有相同名称的数据框),并将数据框“附加”到保存的 .RData 文件。我是否正确理解这一点?再次感谢!
    • 好吧,多亏了你的功能(见上文),也许我快到了……我认为只是命名部分不对……再次感谢!
    • 听起来你在正确的轨道上。如果您的数据对象有可能是彼此的修订版,即许多共同的值,您可能会考虑只存储差异(有点像 SVN 系统)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多