2014-09-22 96 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") 

這樣,那些變量永遠不會真正加載到全局環境中。

相關問題