2014-09-22 3 views
-1

이름이 다르지만 이름은 같지만 내용이 다른 변수가있는 두 개의 데이터 세트가 있습니다. 이제는 일치하는 변수를 다른 데이터 세트로 복사하고 프로세스에서 일치하는 변수 중 하나의 이름을 바꾸고 싶습니다. 이것이 가능한가?다른 R 데이터 세트에 변수 복사 및 변수 이름 바꾸기

예 : 난 그냥 지정된 변수를 복사하고 이름을 변경 드리겠습니다, 또는

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

:

DataSet1.RData has 

.... 
matrix1 
matrix2 
.... 

DataSet2.RData has 

.... 
matrix1 
matrix2 
.... 

내가 가진 세 번째 데이터 집합 (DataSet3)을 생성하고 싶습니다 하나의 데이터 세트에서 다른 데이터 세트로. 감사합니다

+0

[triothing try anything?] (http://whathaveyoutried.com) – Barranka

+0

Barranka, 예. 웹을 검색했지만 관련성이 없습니다. – jpcgandre

+1

그래서 "dataset"은'save()'를 통해 RData 파일에 저장된 R 객체를 의미합니까? 그리고 지금 당신은'load()'를 사용하고 있지만 객체 객체는 매번 다시 쓰여지고 있습니까? 로드하는 동안 명시 적으로 모든 오브젝트의 이름을 지정 하시겠습니까? 아니면 이름 충돌을 막기를 원합니 까? 글로벌 환경 만 사용 중이거나 사용자 지정 환경에 개체를로드하고 있습니까? – MrFlick

답변

2

load 래퍼를 만들어 기존 작업 영역과 충돌하는 개체를 만드는 방법은 어떻습니까? 당신이

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

다음 예를 Fopr

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 파일 만 "병합"하려는 경우 , something like

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

이러한 변수는 실제로 전역 환경에로드되지 않습니다.

관련 문제