SAS 데이터 세트 및 결과 출력에서 변수를 재정렬하는 7 가지 방법
SAS®를 사용하는 실무자는 특정 순서로 출력 데이터 파일에 변수를 제시해야 하는 경우가 더러 있으며 특정 규정에 따라 생산 데이터 파일의 변수를 특정 순서로 정렬해야 할 수도 있습니다. 데이터 파일에서 변수의 순서를 변경하려는 일반적인 이유는 파일 병합 후 또는 다소 정렬되지 않은 데이터 파일을 사용하는 ARRAY, ATTRIB, LENGTH 또는 RETAIN 명령문 사용할 때 입니다.
SAS는 SAS 데이터 파일, 다른 형식의 데이터 테이블 및 ODS 출력을 포함하여 모든 유형의 SAS 출력을 제어하는 다양한 방법을 제공합니다. 이 문서는 다른 SAS 데이터 세트에서 생성되어 출력된 SAS 데이터 파일, 특히 DATA 단계 및 PROC SQL 방식에 중점을 둡니다.
첫째, 데이터 파악
SAS로 만든 결과물에 대한 정보를 완전히 이해하여 숙지하는 것이 중요합니다. 변수의 순서를 변경하려면 먼저 SAS 데이터 세트의 현 위치를 포함하여 해당 변수에 대한 정보를 수집해야 합니다. 이 메타데이터는 PROC CONTENTS, PROC DATASETS, 사전, SASHELP, % sysfunc 및 기타 시스템 매크로 및 V 함수를 비롯한 다양한 방법으로 얻을 수 있습니다. 이 글에서는 유비쿼터스 PROC CONTENTS를 사용합니다. Hogwartian 데이터 세트 생성 코드는 기사 하단에 작성되어 있습니다.
* THE CONTENTS PROCEDURE; PROC CONTENTS DATA=DD.HARRYPOTTER_LABELLED OUT=LABELLED_CONTENTS (KEEP=NAME TYPE LENGTH LABEL FORMAT INFORMAT VARNUM); RUN; |
출력 데이터 파일은 관심 변수만 유지하게 하는 KEEP 명령문을 사용하여 CONTENTS 를 통해 생성됩니다.
기존 데이터 파일에서 변수가 표시되는 순서를 변경하려면 SAS가 특정 조건에서 변수 순서를 결정하는 방법을 알아야 합니다. DATA 단계에서 변수 순서는 프로그램 데이터 벡터를(PDV) 통과 할 때 첫 번째 언급된 변수에 의해 결정됩니다. 변수 순서를 설정할 수 있는 DATA 단계 명령문은 ARRAY, ATTRIB, FORMAT, INFORMAT, LENGTH 및 RETAIN 등이 있습니다.이러한 명령문은 순서 변경을 위해 SET, MERGE 또는 UPDATE 명령문 앞에 와야 합니다. 명령문에서 변수가 언급되는 순서에 따라 해당 데이터 파일 내 변수의 순서가 결정됩니다. 명령문에 변수가 리스트화 되지 않은 경우, 변수는 언급된 순서대로 나타나고, 나머지 변수는 데이터 파일 원본 또는 데이터 파일이 생성되는 경우에는 INPUT 명령문에서 본래 순서로 나타납니다.
DATA 단계 명령문 외에도 PROC SQL을 사용하여 위에서 설명한 DATA STEP 명령문과 유사한 방식으로 기존 데이터 파일의 변수 순서를 변경할 수 있습니다. PROC SQL SELECT 및 SELECT AS 명령문은 기존 데이터 파일에서 생성된 새 데이터 파일에서 변수의 순서, 형식 지정, 길이 설정 및 이름 바꾸기에 사용할 수 있습니다.
데이터 순서를 변경하는 각 방법은 명령문에 메타데이터 정보를 제공해야 합니다. 광범위한 변수의 속성 목록을 작성하는 대신 SAS 메타데이터를 사용하여 명령문을 작성할 수 있습니다. RETAIN, FORMAT, INFORMAT, PROC SQL 등과 같은 방법은 순서가 지정된 변수 목록을 입력해야 합니다. 메타 데이터 정보를 추가 사용할 수 있지만 반드시 필요한 부분은 아닙니다. 하지만 ATTRIB, ARRAY, LENGTH 등은 변수의 길이, 변수 레이블 또는 변수 유형과 같은 별도의 정보가 필요합니다. SAS 메타데이터를 사용하여 다양한 방법으로 명령문을 만들 수 있습니다.
SAS 메타데이터을 통한 데이터 기반 코드를 작성하는 두 가지 방법은 다음과 같습니다. 선이행되어야 하는 부분은 위에서 만들어진 후 다양한 방식으로 다른 출력 데이터 파일로 정렬된 LABELLED_CONTENTS 데이터 파일을 사용하는 것입니다.
* TEST FILE PRECURSOR STEPS: SORT OUT DATA SETS IN SPECIFIC ORDERS; * VARIABLE NAME (NAME) IS KEY; * POINT IS TO PROVIDE VARIABLE LISTS IN DIFFERENT ORDER;
*ALPHA ORDER; PROC SORT DATA=LABELLED_CONTENTS OUT=LABELLED_BY_NAME; BY NAME; RUN;
*DESCENDING POSITION; PROC SORT DATA=LABELLED_CONTENTS OUT=LABELLED_BY_DVARNUM; BY DESCENDING VARNUM; RUN;
*LENGTH ORDER; PROC SORT DATA=LABELLED_CONTENTS OUT=LABELLED_BY_LENGTH; BY LENGTH; RUN;
* TEST FILE PREPARATION METHOD 1: MACRO LISTS FROM METADATA VIA PROC SQL INTO:; * CREATES MACRO LISTS THAT CAN BE USED IN DATA SET STATEMENTS AND PROC SQL;
PROC SQL; SELECT NAME INTO :VARNUM_ORDER SEPARATED BY ' ' FROM LABELLED_CONTENTS; quit;
%PUT By Original Order = &VARNUM_ORDER;
PROC SQL; SELECT NAME INTO :NAME_ORDER SEPARATED BY ' ' FROM LABELLED_BY_NAME; quit;
%PUT By Alpha Order = &NAME_ORDER;
* TEST FILE PREPARATION METHOD 2: STRUCTURED INCLUDE FILE VIA DATA _NULL_; * CREATES AN “INCLUDE” FILE TO BE USED IN LENGTH STATEMENTS USING SAS METADATA; * NOTE CONDITIONALLY CREATES STRINGS BASED ON TYPE;
DATA _NULL_; FILE '.\STRING_ORDER.TXT' LRECL=50 PAD; LENGTH STRING_ORDER $ 50; SET LABELLED_BY_NAME; IF TYPE=2 THEN STRING_ORDER=CATX(' ',NAME,'$',LENGTH); ELSE IF TYPE=1 THEN STRING_ORDER=CATX(' ',NAME,LENGTH); PUT STRING_ORDER; RUN;
* TEST FILE PREPARATION METHOD 3: STRUCTURED INCLUDE FILE VIA DATA _NULL_; * CREATES AN “INCLUDE” FILE TO BE USED IN ARRAY STATEMENTS USING SAS METADATA; * NOTE CONDITIONALLY CREATES SEPARATE MACRO VARIABLES BASED ON TYPE;
DATA CHARS NUMS; SET LABELLED_BY_DVARNUM; IF TYPE=2 THEN OUTPUT CHARS; ELSE IF TYPE=1 THEN OUTPUT NUMS; RUN;
PROC SQL; SELECT NAME INTO :DVARNUM_ORDER_C SEPARATED BY ' ' FROM CHARS; QUIT;
PROC SQL; SELECT NAME INTO :DVARNUM_ORDER_N SEPARATED BY ' ' FROM NUMS; quit;
%PUT By Descending Varnum Char Order = &DVARNUM_ORDER_C; %PUT By Descending Varnum Num Order = &DVARNUM_ORDER_N; |
테스트 파일 준비 방법 2에서 % INCLUDE 파일로 생성된 LENGTH 명령문을 사용하는 예시는 다음과 같습니다. LENGTH 명령문에는 문자 변수의 경우에는 유형 지정 및 길이가 제공되어야 하므로 위의 % INCLUDE 파일 생성에 SAS 메타데이터가 사용됩니다. LENGTH 명령문은 SET 명령문 상위에 속합니다. ATTRIB 명령문 SAS 메타 데이터를 사용하여 LENGTH 명령문과 유사한 방식으로 구성되어 동일한 방식으로 사용할 수 있습니다.
* EXAMPLE 1: LENGTH STATEMENT (ATTRIB STATEMENT IS SIMILAR); DATA DD.HARRYPOTTER_LENGTH (LABEL="Harry Potter Sample Data Set - Variables Ordered with Length Statement"); LENGTH %INCLUDE '.\STRING_ORDER.TXT'; SET DD.HARRYPOTTER_LABELLED; RUN; |
SAS 메타데이터를 사용하여 생성된 ARRAY 명령문 사용은 LENGTH 명령문 방식과 유사합니다. 문자 및 숫자 변수의 개별 매크로 변수 목록은 메타데이터의 변수 유형을 기반으로 생성되어 SET 명령문 상위에 있는 DATA 단계에 배포됩니다. 문자 변수와 숫자 변수를 분리하는 이유는 배열이 변수 유형의 혼합을 허용하지 않기 때문입니다. 형식 정보와 같은 추가 지침을 ARRAY 명령문에 삽입할 수 있으며 유형 및 형식에 대한 메타데이터 값에 따라 다양한 ARRAY 명령문을 가질 수 있습니다. 이 예시에서는 유형 이외의 정보를 다루지 않습니다.
* EXAMPLE 2: ARRAY STATEMENT; DATA DD.HARRYPOTTER_ARRAY (LABEL="Harry Potter Sample Data Set - Variables Ordered with Array Statements"); ARRAY CH (*) $ 50 &DVARNUM_ORDER_C. ; ARRAY NU (*) &DVARNUM_ORDER_N. ; SET DD.HARRYPOTTER_LABELLED; RUN; |
RETAIN 명령문은 변수 메타데이터 정보가 필요하지 않고, 정돈된 순서의 변수 목록 만 필요하다는 점에서 ARRAY 명령문과 유사합니다. FORMAT 및 INFORMAT 명령문 또한 동일한 방식으로 작동합니다. 이러한 세 가지 DATA STEP 명령문은 모두 추가 작업이 가능하지만 작업을 복잡하게 만들 가능성이 있으므로 굳이 필요한 과정은 아닙니다. 예를 들어, RETAIN 명령문은 DATA 단계의 반복에서 값을 유지하거나 전달하는 데 사용됩니다. 이러한 목적으로 RETAIN 명령문을 사용하여 데이터를 재정렬하는 경우 오류 또는 예상치 못한 결과가 발생할 위험이 존재합니다. 변수를 재정렬하는 명령문의 기능은 부가 기능일 뿐입니다.
* EXAMPLE 3: RETAIN / FORMAT / INFORMAT STATEMENTS; DATA DD.HARRYPOTTER_RETAIN (LABEL="Harry Potter Sample Data Set - Variables Ordered with Retain Statement"); RETAIN &NAME_ORDER.; SET DD.HARRYPOTTER_LABELLED; RUN; |
변수 재정렬이 가능한 PROC SQL은 PROC SQL이 재정렬된 변수 목록만을 필요로 하나 길이, 형식 등과 같은 추가 속성을 지정할 수 있다는 점에서 RETAIN, FORMAT, INFORMAT 명령문과 유사합니다. PROC SQL은 변수의 이름을 바꾸거나 별칭을 만들 수 있다는 점에서도 유니크합니다. 종종 SAS 실무자는 리포팅을 보다 간결히 하기 위해 데이터 파일의 변수 순서를 변경할 수 있습니다. 더불어 SAS 데이터 파일, Excel 파일, XML 파일 등과 같은 임시 혹은 영구적인 출력 데이터를 특정 방식으로 정렬해야 하는 때도 있습니다. 예를 들어, XML 맵 또는 스키마를 사용하여 생성된 XML 파일의 경우 대소문자 구분 및 변수 순서가 중요합니다. PROC SQL를 통한 변수 재정렬의 경우 XML 케이스 요구 사항과 일치하도록 변수 이름을 바꿀 수 있습니다. 이 예시의 코드는 다른 세 가지 예제와 같이 프로그래밍 방식으로 구축되지 않았지만 손쉽게 생성할 수 있습니다.
* EXAMPLE 4: PROC SQL TO REORDER VARIABLES; PROC SQL; CREATE TABLE DD.HARRYPOTTER_SQL AS SELECT animal ,bloodstatus ,combined_name ,da ,deatheater ,deceased as deadasadoornail ,firstname ,house ,lastname ,middlename ,ministryofmagic as MOM ,nickname ,oop as OrderOfthePhoenix ,patronus ,professor ,quidditch_wins ,school from dd.harrypotter_labelled ORDER BY lastname ; QUIT; |
PROC SQL 및 ATTRIB 명령문은 변수 순서 변경을 위한 코딩에 가장 많은 유연성을 제공하면서도 최소한의 시간을 필요로 합니다. PROC SQL은 동일한 명령 내에서 변수의 이름을 바꾸거나 별칭을 지정 할 수 있는 기능으로 ATTRIB 명령문을 앞섭니다.
아래는 위의 예시에서 사용된 샘플 데이터 파일을 만드는 코드입니다. 사용자가 사용할 수 있는 모든 데이터 파일은 물론 글에 기술된 방식으로 작동합니다. SASHELP.CLASS 또는 SASHELP.HEART는 대개 데모 목적으로 자주 사용됩니다.
title1 'Create Harry Potter themed data file'; run; data dd.harrypotter (label='Harry Potter themed data file for use in demonstrating functions'); length combined_name school bloodstatus $ 50 firstname middlename lastname nickname house patronus animal $ 25 ; combined_name='Potter, Harry'; firstname='Harry'; middlename='James'; lastname='Potter'; school='Hogwarts'; house='Gryffindor'; patronus='Stag'; nickname=''; animal='Snowy Owl'; quidditch_wins=9; professor=0; ministryofmagic=1; deceased=0; da=1; oop=0; deatheater=0; bloodstatus='Half-Blood'; output;
combined_name='Longbottom, Neville'; firstname='Neville'; middlename=''; lastname='Longbottom'; school='Hogwarts'; house='Gryffindor'; patronus='Non-Corporeal'; nickname=''; animal='Toad'; quidditch_wins=.N; professor=1; ministryofmagic=0; deceased=0; da=1; oop=0; deatheater=0; bloodstatus='Pure Blood'; output;
combined_name='Lovegood, Luna'; firstname='Luna'; middlename=''; lastname='Lovegood'; nickname='Loony'; school='Hogwarts'; house='Ravenclaw'; patronus='Hare'; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=0; da=1; oop=0; deatheater=0; bloodstatus='Pure Blood'; output;
combined_name='Weasley, Ronald'; firstname='Ronald'; middlename='Bilius'; lastname='Weasley'; school='Hogwarts'; house='Gryffindor'; nickname='Ron'; patronus='Jack Russell Terrier'; animal='Rat, then Owl'; quidditch_wins=6; professor=0; ministryofmagic=0; deceased=0; da=1; oop=0; deatheater=0; output;
combined_name='Weasley, Fred'; firstname='Fred'; middlename='Fabian'; lastname='Weasley'; school='Hogwarts'; house='Gryffindor'; nickname='Gred'; patronus=''; animal=''; quidditch_wins=8; professor=0; ministryofmagic=0; deceased=1; da=1; oop=0; deatheater=0; bloodstatus='Pure Blood'; output;
combined_name='Weasley, George'; firstname='George'; middlename='Gideon'; lastname='Weasley'; school='Hogwarts'; house='Gryffindor'; nickname='Forge'; patronus=''; animal=''; quidditch_wins=8; professor=0; ministryofmagic=0; deceased=0; da=1; oop=0; deatheater=0; bloodstatus='Pure Blood'; output;
combined_name='Granger, Hermione'; firstname='Hermione'; middlename='Jean'; lastname='Granger'; school='Hogwarts'; house='Gryffindor'; patronus='Otter'; nickname='Hermy'; animal='Cat'; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=0; da=1; oop=0; deatheater=0; bloodstatus='Muggle Born'; output;
combined_name='Weasley, Ginevra'; firstname='Ginevra'; middlename='Molly'; lastname='Weasley'; school='Hogwarts'; house='Gryffindor'; patronus='Horse'; nickname='Ginny'; animal='Puffskein'; quidditch_wins=25; professor=0; ministryofmagic=0; deceased=0; da=1; oop=0; deatheater=0; bloodstatus='Pure Blood'; output;
combined_name='Weasley, Percival'; firstname='Percival'; middlename='Ignatius'; lastname='Weasley'; school='Hogwarts'; house='Gryffindor'; patronus=''; nickname='Percy'; animal='Rat, then Owl'; quidditch_wins=.N; professor=0; ministryofmagic=1; deceased=0; da=1; oop=0; deatheater=0; bloodstatus='Pure Blood'; output;
combined_name='Malfoy, Draco'; firstname='Draco'; middlename='Lucius'; lastname='Malfoy'; school='Hogwarts'; house='Slytherin'; patronus=''; nickname=''; animal=''; quidditch_wins=2; professor=0; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=1; bloodstatus='Pure Blood'; output;
combined_name='Black, Sirius'; firstname='Sirius'; middlename='Orion'; lastname='Black'; school='Hogwarts'; house='Gryffindor'; patronus='Black Dog'; nickname='Padfoot'; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=1; bloodstatus='Pure Blood'; output;
combined_name='Black, Regulus'; firstname='Regulus'; middlename='Arcturus'; lastname='Black'; school='Hogwarts'; house='Slytherin'; patronus=''; nickname='RAB'; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=1; da=0; oop=0; deatheater=1; bloodstatus='Pure Blood'; output;
combined_name='Dumbledore, Albus'; firstname='Albus'; middlename='Percival Wulfric Brian'; lastname='Dumbledore'; school='Hogwarts'; house='Gryffindor'; patronus='Phoenix'; nickname=''; animal='Phoenix'; quidditch_wins=.N; professor=1; ministryofmagic=0; deceased=1; da=0; oop=1; deatheater=0; bloodstatus='Half Blood'; output;
combined_name='Tonks, Nymphadora'; firstname='Nymphadora'; middlename=''; lastname='Tonks'; school='Hogwarts'; house='Hufflepuff'; patronus='Wolf'; nickname='Tonks'; animal=''; professor=0; ministryofmagic=0; deceased=1; da=0; oop=1; deatheater=0; bloodstatus='Half Blood'; output;
combined_name='MacMillan, Ernie'; firstname='Ernie'; middlename=''; lastname='MacMillan'; school='Hogwarts'; house='Hufflepuff'; patronus='Boar'; nickname=''; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=0; da=1; oop=0; deatheater=0; bloodstatus='Half Blood'; output;
combined_name='Dumbledore, Aberforth'; firstname='Aberforth'; middlename=''; lastname='Dumbledore'; school='Hogwarts'; house='Gryffindor'; patronus='Goat'; nickname=''; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=0; bloodstatus='Half Blood'; output;
combined_name='Potter, James'; firstname='James'; middlename=''; lastname='Potter'; school='Hogwarts'; house='Gryffindor'; patronus='Stag'; nickname='Prongs'; animal=''; quidditch_wins=9; professor=0; ministryofmagic=0; deceased=1; da=0; oop=0; deatheater=0; bloodstatus='Pure Blood'; output;
combined_name='Potter, Lily'; firstname='Lily'; middlename=''; lastname='Potter'; school='Hogwarts'; house='Gryffindor'; patronus='Doe'; nickname=''; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=1; da=0; oop=0; deatheater=0; bloodstatus='Muggle Born'; output;
combined_name='Snape, Severus'; firstname='Severus'; middlename=''; lastname='Snape'; school='Hogwarts'; house='Slytherin'; patronus='Doe'; nickname='Half-Blood Prince'; animal=''; quidditch_wins=.N; professor=1; ministryofmagic=0; deceased=1; da=0; oop=1; deatheater=1; bloodstatus='Half Blood'; output;
combined_name='McGonagall, Minerva'; firstname='Minerva'; middlename=''; lastname='McGonagall'; school='Hogwarts'; house='Gryffindor'; patronus='Cat'; nickname=''; animal=''; quidditch_wins=.N; professor=1; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=0; bloodstatus='Half Blood'; output;
combined_name='Lupin, Remus'; firstname='Remus'; middlename=''; lastname='Lupin'; school='Hogwarts'; house='Gryffindor'; patronus='Moon'; nickname='Moony'; animal=''; quidditch_wins=.N; professor=1; ministryofmagic=0; deceased=1; da=0; oop=1; deatheater=0; bloodstatus='Half Blood'; output;
combined_name='Weasley, Arthur'; firstname='Arthur'; middlename=''; lastname='Weasley'; school='Hogwarts'; house='Gryffindor'; patronus='Weasel'; nickname=''; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=1; deceased=0; da=0; oop=1; deatheater=0; bloodstatus='Pure Blood'; output;
combined_name='Shacklebolt, Kingsley'; firstname='Kingsley'; middlename=''; lastname='Shacklebolt'; school='Hogwarts'; house=''; patronus='Lynx'; nickname=''; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=1; deceased=0; da=0; oop=1; deatheater=0; bloodstatus='Pure Blood'; output;
combined_name='Finnigan, Seamus'; firstname='Seamus'; middlename=''; lastname='Finnigan'; school='Hogwarts'; house='Gryffindor'; patronus='Fox'; nickname=''; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=0; bloodstatus='Half Blood'; output;
combined_name='Chang, Cho'; firstname='Cho'; middlename=''; lastname='Chang'; school='Hogwarts'; house='Hufflepuff'; patronus='Swan'; nickname=''; animal=''; quidditch_wins=4; professor=0; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=0; bloodstatus='Half Blood'; output;
combined_name='Delacour, Fleur'; firstname='Fleur'; middlename=''; lastname='Delacour'; school='Beauxbatons Academy of Magic'; house=''; patronus=''; nickname=''; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=0; bloodstatus='Unknown'; output;
combined_name='Delacour, Gabrielle'; firstname='Gabrielle'; middlename=''; lastname='Delacour'; school='Beauxbatons Academy of Magic'; house=''; patronus=''; nickname=''; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=0; bloodstatus='Unknown'; output;
combined_name='Maxime, Olympe'; firstname='Olympe'; middlename=''; lastname='Maxime'; school='Beauxbatons Academy of Magic'; house=''; patronus=''; nickname=''; animal=''; quidditch_wins=.N; professor=1; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=0; bloodstatus='Half Human'; output;
combined_name='Hagrid, Rubeus'; firstname='Rubeus'; middlename=''; lastname='Hagrid'; school='Hogwarts'; house='Gryffindor'; patronus=''; nickname='Hagrid'; animal='Acromantula'; quidditch_wins=.N; professor=1; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=0; bloodstatus='Half Blood'; output;
combined_name='Krum, Victor'; firstname='Victor'; middlename=''; lastname='Krum'; school='Durmstrang Institute'; house=''; patronus=''; nickname=''; animal=''; quidditch_wins=85; professor=0; ministryofmagic=0; deceased=0; da=0; oop=0; deatheater=0; bloodstatus='Unknown'; output;
combined_name='Grindelwald, Gellert'; firstname='Gellert'; middlename=''; lastname='Grindelwald'; school='Durmstrang Institute'; house=''; patronus=''; nickname=''; animal=''; quidditch_wins=.N; professor=0; ministryofmagic=0; deceased=1; da=0; oop=0; deatheater=0; bloodstatus='Pure or Half Blood'; output;
combined_name='Karkaroff, Igor'; firstname='Igor'; middlename=''; lastname='Karkaroff'; school='Durmstrang Institute'; house=''; patronus=''; nickname=''; animal=''; quidditch_wins=.N; professor=1; ministryofmagic=0; deceased=1; da=0; oop=0; deatheater=1; bloodstatus='Pure Blood'; output;
run; |
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.
Lock in the best rate now before the price increases on April 1.