2014-09-22 2 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

+0

Барранка, да, я ищу в Интернете, но ничего интересного не придумали. – jpcgandre

+1

Итак, по «набору данных» вы имеете в виду объекты R, которые были сохранены в файле RData с помощью 'save()'? И сейчас вы используете 'load()', но объекты объектов переписываются каждый раз? Вы хотите явно указать все объекты во время загрузки? Или вы просто хотите избежать столкновений имен? Используете ли вы только глобальную среду или вы загружаете объекты в настраиваемые среды? – MrFlick

ответ

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

это попытается перезагрузить m1 и m2, 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 

Эта функция никогда не должна переписывать значения, она всегда добавляет что-то уникальное имя. Итак, вы продолжаете работать safeload в том же файле RData, а затем будете создавать новые переменные. Функция будет невидимо возвращать окончательные имена только что загруженных объектов (с исходными именами из файла 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") 

Таким образом, эти переменные никогда не будут загружены в глобальную среду.

Смежные вопросы