2016-12-05 3 views
1

합계가 특정 값보다 작은 SAS 데이터 세트의 열을 삭제하려고합니다. 아래 사례를 생각해보십시오.SAS를 사용하여 값의 합계를 기반으로 변수를 내림

Column_A Pred_1 Pred_2 Pred_3 Pred_4 Pred_5 
A    1  1  0  1  0 
A    0  1  0  1  0 
A    0  1  0  1  0 
A    0  1  0  1  1 
A    0  1  0  0  1 

하는 것은 우리의 임계 ​​값이 4라고 가정 해 보자, 그래서 덜 4보다 적극적인 관찰의 합계를 가지고 예측을 삭제하고자하는, 그래서 매우 사용하고 현재

Column_A Pred_2 Pred_4 
A    1  1 
A    1  1 
A    1  1 
A    1  1 
A    1  0 

같은 출력이 보일 것이다 여러 transpose를 사용하여 예측자를 떨어 뜨리는 비효율적 인 방법. 레코드가 30,000보다 많은 데이터 세트가 여러 개 있으므로 조인 방식에 시간이 걸립니다. 누구나 좀 더 효율적인 해결책이 있다면 고맙겠습니다!

감사합니다.

답변

0

당신이 할 수있는 것 같다 :

  1. 실행 PROC MEANS 또는 유사한 시저는 합계를 얻기 위해
  2. 그 변수를 드롭 귀의 합 <와 데이터 세트에서 모든 변수를 포함하는 매크로 변수를 만듭니다

다음은 아니요 TRANSPOSE 또는 무엇이든 일반 일반 이전 요약 및 삭제 만 가능합니다. 참고 에 OUT=이 아닌 ODS OUTPUT을 사용해야합니다. 그렇지 않으면 정상 PROC MEANSOUT= 데이터 세트가 PROC TRANSPOSE이어야합니다.

사소한 데이터 세트를 사용하는 예 :

data have; 
    array x[20]; 
    do _n_ = 1 to 20; 
    do _i = 1 to dim(x); 
     x[_i] = rand('Uniform') < 0.2; 
    end; 
    output; 
    end; 
run; 

ods output summary=have_sums; *how we get our output; 
ods html select none;   *stop it from going to results window; 
proc means data=have stackodsoutput sum; *stackodsoutput is 9.3+ I believe; 
    var x1-x20; 
run; 
ods html select all;   *reenable normal html output; 

%let threshhold=4;    *your threshhold value; 

proc sql; 
    select variable 
    into :droplist_threshhold separated by ' ' 
    from have_sums 
    where sum lt &threshhold; *checking if sum is over threshhold; 
quit; 

data want; 
    set have; 
    drop &droplist_threshhold.; *and now, drop them!; 
run; 
+0

감사합니다. 나는 이것을 EG에서 실행했고 proc 수단을 실행할 때이 오류가 발생했습니다. 오류 : HTML 대상이 활성화되어 있지 않습니다. 선택/제외 목록을 사용할 수 없습니다. 생각 하시겠습니까? –

+0

'oss html을 제거 할 수 있습니다. – Joe

+0

'ODS HTML' 행을 삭제할 수 있습니다. 그것들은 단지 스크린 출력을 줄이기위한 것입니다. – Joe

0

그냥 금액을 얻기 위해 PROC SUMMARY를 사용합니다. 그런 다음 데이터 단계를 사용하여 삭제할 변수 이름 목록을 생성 할 수 있습니다.

%let threshhold=4; 
%let varlist= pred_1 - pred_5; 

proc summary data=have ; 
    var &varlist ; 
    output out=sum sum= ; 
run; 

data _null_; 
    set sum ; 
    array x &varlist ; 
    length droplist $500 ; 
    do i=1 to dim(x); 
    if x(i) < &threshhold then droplist=catx(' ',droplist,vname(x(i))); 
    end; 
    call symputx('droplist',droplist); 
run; 

당신은 다음 DROP 문 또는 DROP= 데이터 세트 옵션을 생성하는 매크로 변수를 사용할 수 있습니다.

drop &droplist;