将变量复制到另一个R数据集并重命名变量

时间:2014-09-22 02:56:45

标签: r

我有两个名称不同的数据集,但有些变量具有相同的名称但内容不同。现在我想将重合变量复制到另一个数据集,并在此过程中重命名其中一个重合变量。这可能吗?

示例:

DataSet1.RData has

....
matrix1
matrix2
....

DataSet2.RData has

....
matrix1
matrix2
....

我想用:

创建第三个DataSet(DataSet3
matrix1
matrix2
matrix3 (former matrix1 of DataSet2.RData)
matrix4 (former matrix2 of DataSet2.RData)

或者,我很乐意将指定的变量从一个DataSet复制并重命名为另一个。感谢

1 个答案:

答案 0 :(得分:2)

如何为load创建包装器以重命名与现有工作空间冲突的对象。 Fopr例子

safeload<-function(file, env=parent.frame()) {
    tmp<-new.env()
    load.names <- load(file, tmp)
    exist.names <- ls(envir=env)
    new.names <- make.names(c(exist.names, load.names), unique=TRUE)[-seq_along(exist.names)]
    Map(assign, new.names, mget(load.names, tmp), MoreArgs=list(envir=env))
    attr(new.names, "orig.names) <- load.names
    invisible(new.names)
}

然后,如果你尝试

m1 <- matrix(1:4, ncol=2)
m2 <- matrix(5:8, ncol=2)
save(m1,m2, file="t1.RData")

m1 <- matrix(11:14, ncol=2)
m2 <- matrix(15:18, ncol=2)
save(m1,m2, file="t2.RData")

您会看到m1m2的当前值

m1
#      [,1] [,2]
# [1,]   11   13
# [2,]   12   14

m2
#      [,1] [,2]
# [1,]   15   17
# [2,]   16   18

然后如果我们运行

safeload("t1.RData")

这会尝试重新加载m1m2, but since those exist, we use make.name()to create unique names for those values. It renames the m1 to m1.1`。所以我们现在有了

m1
#      [,1] [,2]
# [1,]   11   13
# [2,]   12   14

m1.1
#      [,1] [,2]
# [1,]    1    3
# [2,]    2    4

这个函数永远不应该覆盖值,它总会附加一些东西以使名称唯一。因此,您继续在同一个RData文件上运行safeload,然后它将继续创建新变量。该函数将无形地返回它刚刚加载的对象的最终名称(使用RData文件中的原始名称作为名为“orig.names”的属性)

如果你只想“合并”那两个RData文件,比如

newds<-new.env()
safeload("t1.RData", newds)
safeload("t2.RData", newds)
save(list=ls(envir=newsd), envir=newds, file="t3.RData")

这样,这些变量实际上永远不会被加载到全局环境中。