2014-12-04 6 views
0

다음은 내가하는 일의 예입니다. 데이터 세트의 하위 집합 (예 : 알파벳 열에 이러한 문자가있는 행)을 가져오고 싶습니다. Transport_company가 Hyundai, Toyota 또는 Ford 인 레코드 만 선택하려고합니다.SAS : 열에 배열 값이있는 경우

Data arrayInIf; 
set OldTable; 
array Car_array {3}a b c('Hyundai', 'Toyota', 'Ford'); 
If Transport_company ^= Car_array 
Then 
    Delete; 
Run; 

뭐가 잘못 됐나요? 이걸 어떻게 작동시킬 수 있을까요?

이 좋아, 그래서 샘플 데이터가 될 것이다 : 현대 10

  • 90,145 NASA 50
  • 20,202 도요타 30
  • 40002 할리 데이비슨 5
  • 12345 판매

    • 우편 Transport_Company 호
    • 10000 포드 15

    그래서 나는 자동차 회사와 관련된 모든 행을 유지하고 싶습니다.

  • +0

    데이터 샘플을 게시 할 수 있습니다. 이는 기여도에 도움이됩니다. –

    답변

    1

    로비의 권리 -에 괜찮습니다. 그 는 배열 경우

    그러나, 이미 (수치 또는 whichn) whichc 좋은 해결책이다. 일반적으로

    data oldtable; 
    input Zip Transport_Company $ No_Sold; 
    datalines; 
    12345 Hyundai 10 
    90145 NASA 50 
    20202 Toyota 30 
    40002 HarleyDavidson 5 
    10000 Ford 15 
    ;;;; 
    run; 
    
    Data arrayInIf; 
        set OldTable; 
        array Car_array{3} $ ('Hyundai', 'Toyota', 'Ford'); 
        If whichc(transport_company,of car_array[*])=0 
        Then 
        Delete; 
    Run; 
    

    ,이 작업을 수행 할 수있는 가장 방법은 형식을 구성하는 것입니다. 데이터 집합에서이 작업을 수행하는 방법은 PROC FORMAT CNTLIN을 참조하십시오.

    proc format; 
        value $automakerF 
        'Hyundai','Toyota','Ford'=1 
        other=0; 
    quit; 
    
    data fmtInIf; 
        set oldtable; 
        if put(transport_company,automakerF.) ne '1' 
        then delete; 
    run; 
    

    이 당신의 코드에서 데이터를 분리하는 값을 가지고, 플러스 당신이 원하는 경우에 당신은 데이터 집합에서의 자동차 이름을 가져올 수있다; 또는 당신은 코드에서이 작업을 수행 할 수 있습니다 또한 다양한 산업을 모두 하나의 형식으로 처리 할 수 ​​있습니다. if 문이나 in 문보다 훨씬 빠르며 빠릅니다.

    +0

    데이터 단계에서 'if ... then delete'를'where' 문으로 변경하여 두 번째 접근법을 더 빠르게 만들 수 있습니다. –

    1

    여기서는 배열을 사용할 필요가 없다고 생각합니다. 여러 값을 기반으로 행을 선택하려는 경우 in 키워드를 사용하십시오. SAS의 배열 개념은 일반적으로 배열을 문자열과 숫자 값의 집합으로 간주하는 다른 프로그래밍 언어와 다릅니다. SAS의 배열은 열 (변수) 집합을 저장합니다.

    data b; 
    set a; 
    where Transport_Company in ('Hyundai', 'Toyota', 'Ford'); 
    run; 
    

    출력 :

    당신이 긴 목록을 기준으로 행을 필터링해야하는 경우 @ 알렉스는 그의 주석에서 언급 한 바와 같이
    Obs  Zip  Transport_Company  Sold 
        1  12345  Hyundai    10 
        2  20202  Toyota    30 
        3  10000  Ford     15 
    

    , where...in()는 성가신 될 것입니다. 이 경우, 내 솔루션 일반적으로 이러한 이름 가진 새 집합을 만드는 것입니다.

    Transport_Company 
    
    Hyundai 
    Toyota 
    Ford 
    ... 
    BMW 
    

    그럼 proc sql를 사용하여 간단한 의사 - 병합 (조건부 선택)을 수행. 이것은 상당히 빨라야합니다. 데이터가 배열에없는 경우 추가 합병증을 추가하는 것대로 배열 방법을 사용하지 않도록

    proc sql; 
        create table c as 
        select a.* from a, cars where a.Transport_Company = cars.Transport_Company; 
    quit; 
    
    +0

    일반적으로'어디에서 Transport_Company in ... '를 사용하는 것이 더 효율적입니다. 왜냐하면 전자는 조건에 맞는 입력 데이터 세트에서 레코드를 읽는 반면, 후자는 모든 레코드를 읽은 다음 하위 세트를 읽습니다. –

    +0

    제시된 샘플 데이터가 장난감 예제이고 더 많은 자동차 제조사가 실제로 고려되는 경우 'in'을 사용하는 것이 번거로워집니다. 여전히, +1. 귀하의 의견에 대해 –

    +0

    @Alex 감사합니다. 'in'과'where'의 성능 차이에 대해서는별로 인상적이지 않았습니다. 편집 됨. –

    관련 문제