将数据框添加到现有的rdata文件

时间:2016-07-14 02:51:48

标签: r

我是R的新手 并会尽我所能让自己明白。 假设我有一个包含多个对象的现有rdata文件。 现在我想添加一个数据框,我该怎么做? 我尝试了以下方法:

write.data.loc <- 'users/Jim/Objects'

rdataPath <- 'users/Jim/Objects.Rda'

myFile<- read.csv("myFile.csv")

loadObjects <- load(rdataPath)

save(loadObjects,myFile,file=paste(write.data.loc,".Rda",sep=""))

但这似乎不起作用?

2 个答案:

答案 0 :(得分:3)

我不确定您的实际用例,但如果您必须将新对象“追加”到rda文件,则这是一种方法。这会通过load rda文件中的所有对象变为新的environment而变得聪明(有许多教程和指南讨论环境的使用和相关性,Hadley的{ {3}}是一个做得很好的人,我认为。)

第一步将所有对象加载到新的(空)环境中。使用其他空的环境很有用,这样我们就可以使用ls轻松地从中获取所有对象。

e <- new.env(parent = emptyenv())
load("path/to/.rda", envir = e)

您要添加的对象应加载到环境中的变量中。请注意,美元符号访问看起来与list相同,这使得它们(1)容易混淆两者,以及(2)易于理解$提供的命名索引。 / p>

e$myFile <- read.csv("yourFile.csv")

最后一部分,重新​​保存rda文件,是一种间接方法。 ls(envir = e)返回环境中所有对象的变量名称。这很好,因为save可以处理对象或其名称。

do.call("save", c(ls(envir = e), list(envir = e, file = "newsave.rda")))

意识到这不是技术上将data.frame附加到rda文件,它覆盖了rda文件,其中包含一个恰好包含所有文件的新文件以前的对象和新的data.frame。

答案 1 :(得分:0)

我写了这个解决方案,可以添加数据框,列表,矩阵或列表。默认情况下,它将覆盖现有对象,但可以使用overwrite=TRUE进行反转。

add_object_to_rda <- function(obj, rda_file, overwrite = FALSE) {
    .dummy <- NULL
    if (!file.exists(rda_file)) save(.dummy, file = rda_file)

    old_e <- new.env()
    new_e <- new.env()

    load(file = rda_file, envir = old_e)

    name_obj <- deparse(substitute(obj))   # get the name of the object

    # new_e[[name_obj]] <- get(name_obj)     # use this only outside a function
    new_e[[name_obj]] <- obj

    # merge object from old environment with the new environment
    # ls(old_e) is a character vector of the object names
    if (overwrite) {
        # the old variables take precedence over the new ones
        invisible(sapply(ls(new_e), function(x)
            assign(x, get(x, envir = new_e), envir = old_e)))
        # And finally we save the variables in the environment
        save(list = ls(old_e), file = rda_file, envir = old_e)
    }
    else {
        invisible(sapply(ls(old_e), function(x)
            assign(x, get(x, envir = old_e), envir = new_e)))
        # And finally we save the variables in the environment
        save(list = ls(new_e), file = rda_file, envir = new_e)
    }
}