2016-08-12 2 views
2

매크로 변수 &myfiles에 4 개의 데이터 집합 이름 목록이 있습니다.매크로 변수 값을 기준으로 여러 sas 데이터 집합 복사/이름 바꾸기

%put &myfiles; 
cpo.CDR_2016jun cpo.Cog_2016jun cpo.Mile_2016jun cpo.Path_2016jun 

여기서 cpo은 libname입니다.

data &New_Datasets; 
    set &myfiles; 
run; 
: 난 그냥 이런 데이터 단계를 사용하려

%put &New_Datasets; 
CDR Cog Mile Path 

:

은 내가 &New_Datasets 지명 한 다른 매크로 변수에서 이름을 가진 네 개의 새로운 데이터 세트를 만들려고 해요

이지만 &mylist에 참조 된 네 개의 데이터 세트를 모두 합치고 &New_Datasets에 참조 된 네 개의 데이터 세트에 넣고 로그에서 다음 출력을 얻습니다.

NOTE: There were 1482 observations read from the data set CPO.CDR_2016JUN. 
NOTE: There were 1444 observations read from the data set CPO.COG_2016JUN. 
NOTE: There were 255 observations read from the data set CPO.MILE_2016JUN. 
NOTE: There were 7 observations read from the data set CPO.PATH_2016JUN. 
NOTE: The data set WORK.CDR has 3188 observations and 1580 variables. 
NOTE: The data set WORK.COG has 3188 observations and 1580 variables. 
NOTE: The data set WORK.MILE has 3188 observations and 1580 variables. 
NOTE: The data set WORK.PATH has 3188 observations and 1580 variables. 

내가 달성하고자하는 데이터를 생성 cpo.cdr_2016jun에서 1482 개 관찰을하는 것입니다 설정 1,482 관찰과와 work.cdr 등의에서 언급 한 것들의 조합이 아니라 새로운 데이터 세트의 각을하는 것보다 set 문. 어떤 도움이라도 대단히 감사하겠습니다.

+1

매크로 변수가 없으면 원하는 데이터 세트를 만드는 데 사용할 SAS 코드는 무엇입니까? 일단 생성하고자하는 코드를 알게되면 매크로 로직을 사용하여 생성하는 것이 더 쉽습니다. – Tom

답변

2

macrovariables의 값을 반복하는 매크로 프로그램을 작성하고 데이터 단계 또는 proc 사본을 호출해야합니다.

매크로

%macro rewriteDataSets(source_tables=, dest_tables=); 
    %local ii num_source_tables num_dest_tables source_name dest_name; 

    %let num_source_tables = %sysfunc(countw(&source_tables, %str())); 
    %let num_dest_tables = %sysfunc(countw(&dest_tables , %str())); 

    %if &num_source_tables ne &num_dest_tables %then %do; 
     %put ERROR: The number of source and destination tables must be the same in the call to rewriteDataSets; 
     %abort cancel; 
    %end; 

    %do ii=1 %to &num_source_tables; 

     %let source_name = %scan(&source_tables, &ii, %str()); 
     %let dest_name = %scan(&dest_tables , &ii, %str()); 

     data &dest_name; 
     set &source_name; 
     run; 

    %end; 
%mend rewriteDataSets; 

사용 예 :

%rewriteDataSets(source_tables = sashelp.class sashelp.class, 
       dest_tables = a b); 

또는 사용자가 지정한 테이블을 사용하여, 당신은 이런 식으로 부를 것이다 :

%rewriteDataSets(source_tables = cpo.CDR_2016jun cpo.Cog_2016jun cpo.Mile_2016jun cpo.Path_2016jun, 
       dest_tables = CDR Cog Mile Path); 

또는을 사용하십시오. 데이터 단계 대신.

+0

% revriteDatasets & myfiles 및 & New_Datasets 매크로를 전환해야하는 작은 편집 작업을 수행합니다. 감사! –

+0

저는 이것을 일반적으로 좋아하지만 글로벌 매크로 변수를 사용하면 안됩니다. '& myfiles'와'& new_datasets'을 매개 변수로 전달하십시오. – Joe

+0

필자는 코드 사용법 (매크로 사용 경험이 적은 사람들을 위해)이 더 간단하게 보이도록 약간의 코드를 업데이트했으며 몇 가지 기본적인 오류 검사도 추가했습니다. –

3

나는 약간 다르게 내 매크로 변수를 정의하고 이런 짓을 할 것이다 :

%let oldnames = CDR_2016jun Cog_2016jun Mile_2016jun Path_2016jun; 
%let newnames = CDR Cog Mile Path; 

proc datasets lib = cpo noprint; 
    copy out = work; 
    select &oldnames; 
    run; 
quit; 

%macro changes; 
%local i; 
%do i = 1 %to %sysfunc(countw(&oldnames)); 
    %scan(&oldnames, &i, %str()) = %scan(&newnames, &i, %str()) 
%end; 
%mend changes; 

proc datasets lib = work noprint; 
    change %changes; 
    run; 
quit; 

다른 방법으로, cpo 원래 데이터 세트의 work에서보기를 만들 수 있습니다.

+0

답변을 주셔서 감사합니다. 지금 당장 사용하려면 proc 데이터 세트에 익숙하지 않지만 조사해 보겠습니다. 내 평판이 충분히 높으면 나는 당신에게 업보트를 줄 것이다. –

+0

@RMontgomery 데이터 세트의 이름을 바꾸려면'proc datasets'가 가장 빠릅니다. 복사하는 경우'proc copy' 또는'proc datasets'과'copy' 문을 사용하십시오. 다시 작성하는 동안 일부 논리를 구현하면 '데이터 단계'입니다. 그러나 작은 데이터 세트를 사용하는 경우에는 집중할 필요가 없습니다. 가장 적합한 방법을 선택하십시오. – fl0r3k

+0

@ fl0r3k 정보 주셔서 감사합니다, 지금은 proc 데이터 세트에 대해 읽었습니다. 현재의 프로세스를 능률화하기 위해 훨씬 더 큰 데이터 세트에서이 코드를 사용할 것이므로 어떤 추가 효율성이 더 좋을 수도 있습니다. 나는 계속 읽고 있어야 할 것이다, 고마워! –

관련 문제