2012-11-15 6 views
0

이 SAS 데이터 단계 블록에서 TEST_Table이라는 SQL 쿼리에서 테이블을 설정합니다. 이 테이블에는 PREFIX_1 ~ PREFIX_20이라는 큰 섹션의 컬럼을 포함하여 여러 개의 컬럼이 있습니다. 각 열은 PREFIX_부터 시작하여 1에서 20까지의 숫자로 증가합니다.SAS : 동적으로 변수 이름 설정

각 열을 반복적으로 순환하여 해당 열의 값을 분석합니다.

다음은 내가 가고자하는 것의 예입니다. 보시다시피 각 반복마다 증가하는 변수를 만들고 싶습니다. 그런 다음 검사 할 변수 이름의 일부로 해당 개수 값을 사용합니다.

data TEST_Data; 
    set TEST_Table; 
    retain changing_number; 

    changing_number=1; 
    do while(changing_number<=20);  
    if PREFIX_changing_number='BAD_IDENTIFIER' then do; 
     PREFIX_changing_number='This is a bad part'; 
    end; 
    end; 

run; 

SAS에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 나는 20

if PREFIX_1 = 'BAD_IDENTIFIER' then do; 
    PREFIX_1 = 'This is a bad part'; 
end; 
if PREFIX_2 = ... 

단순히 1에서 개별적으로 각각의 값을 확인하여 그것을 할 수있어하지만은 나중에 내가 40 컬럼 세트와 같은 일을하고있을 것이다 정말 독이 될 것이다.

아이디어가 있으십니까?

data TEST_Data; 
    set TEST_Table; 

    array SC $ SC1-SC20; 

    do i=1 to dim(SC);  
     if SC{i}='xxx' then do; 
     SC{i}="bad part"; 
     end; 
    end; 
run; 

솔루션을 제안 배열 주셔서 감사합니다 :) 당신은 SAS의 배열 처리를 볼 필요가

+1

차이점없이 여러 부분을 제거 할 수 있습니다. 변수를 명시 적으로 지정하면 {*}는 불필요합니다. i = 1; 절대적으로 아무것도하지 않습니다. 나는 당신의 코드를 쉽게 관리 할 수있게 해주므로 dim (SC) 대신 20을 사용하는 것을 권장한다. – Joe

+0

@Joe 이러한 변경 사항은 매력보다 효과적입니다. – Stoating

답변

1

. (= 희미한,과

do changing_number = 1 to dim(prefixes); 
... loop ... 
end; 

이 한 번에 모든 그리고 그것은 배열 요소의 수에 유연 :

data TEST_Data; 
    set TEST_Table; 
    *retain changing_number; Remove this - even in your code it does nothing useful; 
    array prefixes prefix:; *one of a number of ways to do this; 
    changing_number=1; 
    do while(changing_number<=20);  
    if prefixes[changing_number]='BAD_IDENTIFIER' then do; 
     prefixes[changing_number]='This is a bad part'; 
    end; 
    end; 

run; 

약간 더 루프는 다음과 같습니다 간단하게, 당신은 같은 것을 할 수 있습니다 넣어 배열의 요소 수).