2014-09-22 131 views
-1

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

实施例:

DataSet1.RData has 

.... 
matrix1 
matrix2 
.... 

DataSet2.RData has 

.... 
matrix1 
matrix2 
.... 

我想创建第三数据集(DataSet3)其中:

matrix1 
matrix2 
matrix3 (former matrix1 of DataSet2.RData) 
matrix4 (former matrix2 of DataSet2.RData) 

可替换地,我很高兴只复制和重命名指定的变量从一个DataSet到另一个。谢谢

+0

[你有没有发现任何东西?](http://whathaveyoutried.com) – Barranka 2014-09-22 03:03:46

+0

Barranka,是的,我在网上搜索,但没有相关的东西出现。 – jpcgandre 2014-09-22 03:10:57

+1

因此,“数据集”是指通过'save()'保存到RData文件的R对象?而现在你正在使用'load()',但是对象每次都会被重写?你想在加载过程中明确指定所有对象吗?或者你想避免名称冲突?您是仅使用全球环境还是将对象加载到自定义环境中? – MrFlick 2014-09-22 03:14:55

回答

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") 

你会看到的m1当前值和m2

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") 

这样,那些变量永远不会真正加载到全局环境中。