2017-10-08 2 views
0

다음 코드에서 여러 변수가 요일에 링크되어 있습니다. 같은 날에 관련된 모든 값 (, 예 : sales_monday1sales_monday2)을 월요일에이라는 새 변수에 합산하여 합계하여 재편성하고자합니다. 이를 위해 , 나는 배열을 사용하는 생각 :접미사 배열에 접두사로 이름을 지정하여 합계를 지정합니다.

data test; 
input sales_monday1 sales_monday2 sales_tuesday sales_wednesday; 
datalines; 
1 1 2 . 
2 5 6 . 
3 20 . 1 
; 
run; 

Data test; 
    ARRAY weekDays{*} Monday Tuesday Wednesday Thursday Friday Saturday Sunday; 
    set test; 

    do i=1 to DIM(weekDays); 
     weekDays{i}= sum(of sales_ weekDays[i]:); 
    end; 
    drop i; 
run; 

내 문제가 있습니다 : 나는 그것이 연결된 변수 이름 weekDays{i}= sum(of sales_ weekDays[i]:);의 일부입니다 고려 sum 함수 내 배열을 참조 할 수 없습니다. 그 문제에 대한 해결책이 있습니까?

+0

데이터 구조를 변경하는 옵션이있는 경우 긴 데이터 형식이 더 유용 할 수 있습니다. 여기에 몇 가지 문제점과 이점을 볼 수 있습니다. https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html – Reeza

답변

0

배열은 그렇게 작동하지 않습니다. 그들이 매크로 변수 인 것처럼 매크로 변수를 사용하고 있습니다.

따라서 매크로 변수에 : 접미사를 사용할 수 없습니다. 대신 몇 가지 방법 중 하나를 사용하여이 작업을 수행 할 수 있습니다.

먼저 모든 변수를 배열에 넣고 둘 중 원하는 순서대로 반복하고 VNAME 및 일부 도움말을 사용하여 변수 이름을 비교할 수 있습니다. 불필요한 비교의 톤처럼

Data test_sum; 
    ARRAY weekDays{*} Monday Tuesday Wednesday Thursday Friday Saturday Sunday; 
    set test; 
    array sales sales_:; 

    do i=1 to DIM(weekDays); 
     do j = 1 to dim(sales); 
     if upcase(compress(scan(vname(sales[j]),2,'_'),,'ka')) = upcase(vname(weekdays[i])) 
      then weekdays[i] = sum(weekdays[i],sales[j]); 
     end; 
    end; 
    drop i j; 
run; 

그것은 매우 비효율적이다, 그래서 당신이 큰 데이터 세트가 있다면 아마도이 당신을 위해하지 않습니다. 아마도 작은 데이터 세트에 대한 올바른 대답 일 것입니다.

큰 데이터 세트의 경우 매크로 언어 대신이 작업을 수행해야합니다.

%macro sum_weekday(name=); 
    %let weekday = %sysfunc(compress(%sysfunc(scan(&name.,2,_)),,ka)); 
    &weekday. = sum(&weekday., &name.); 
%mend sum_weekday; 

proc sql; 
    select cats('%sum_weekday(name=',name,')') into :sumlist separated by ' ' 
    from dictionary.columns 
    where memname='TEST' and libname='WORK' 
    ; 
quit; 

data test_macro; 
    set test; 
    &sumlist; 
run; 

이것은 행마다 한 번이 아니라 변수 목록을 한 번만 보게되므로 매우 효율적입니다. 기본적으로, 그냥 SAS의 모든 테이블에서 변수의 목록입니다 dictionary.columns에 따라

monday = sum(monday, sales_monday1); 
monday = sum(monday, sales_monday2); 
tuesday= sum(tuesday,sales_tuesday); 

등 같은 그러나 많은 문을 만듭니다. (메타 데이터 서버를 통해 많은 라이브러리가 정의 된 서버 환경에있는 경우 속도가 느릴 수 있으며 다른 방법이 있습니다.)

0

코드를 작성하기 만하면됩니다. 1 주일에 7 일 밖에 없습니다.

monday = sum(of sales_monday:); 
tuesday = sum(of sales_tuesday:); 
... 
관련 문제