배열은 그렇게 작동하지 않습니다. 그들이 매크로 변수 인 것처럼 매크로 변수를 사용하고 있습니다.
따라서 매크로 변수에 :
접미사를 사용할 수 없습니다. 대신 몇 가지 방법 중 하나를 사용하여이 작업을 수행 할 수 있습니다.
먼저 모든 변수를 배열에 넣고 둘 중 원하는 순서대로 반복하고 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);
등 같은 그러나 많은 문을 만듭니다. (메타 데이터 서버를 통해 많은 라이브러리가 정의 된 서버 환경에있는 경우 속도가 느릴 수 있으며 다른 방법이 있습니다.)
출처
2017-10-09 02:32:12
Joe
데이터 구조를 변경하는 옵션이있는 경우 긴 데이터 형식이 더 유용 할 수 있습니다. 여기에 몇 가지 문제점과 이점을 볼 수 있습니다. https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html – Reeza