BookmarkSubscribeRSS Feed

[SAS 활용 노하우] SAS basic Syntax 4

Started ‎08-28-2022 by
Modified ‎08-28-2022 by
Views 540

■ Reading Messy Raw Data

정렬되지 않거나 미리 예측 가능한 길이를 가진 데이터를 읽어야 할수도 있습니다. 이러한 유형의 지저분한 파일이 있는 경우 일반 목록, 열 또는 형식화된 입력만으로는 데이터를 정확하게 읽을 방법이 필요합니다. 

 

@'문자' 열은 데이터를 읽기 전에 @ 열 포인터를 사용하여 특정 열로 이동하는 방법을 보여 주었습니다. 

데이터의 시작 열을 모르는 경우도 있지만 항상 특정 문자 또는 단어 뒤에 올 경우 이러한 유형의 경우 @'character' 열 포인터를 사용할 수 있습니다.

예를 들어 강아지 소유권에 대한 정보가 들어 있는 데이터 파일이 있다고 가정합니다. 개의 품종은 항상 "Breed:"라는 단어를 따릅니다.

 

 

 

 

INPUT @’Breed:’ DogBreed $;

 

 

INPUT 문은 개의 품종 이름이 8자 이하(문자 변수의 기본 길이)일 경우에 잘 작동합니다.

강아지가 Shepherd면 괜찮지만 Rottweiler면 Rottweil만 데이터가 추출됩니다. 

$20와 같은 INPUT 문에서 informat 변수를 할당하는 경우, 변수의 필드가 20자임을 SAS에 알리기 위해 SAS는 해당 열에 공백이 있는지 여부에 관계없이 20개 열을 읽습니다.

따라서 DogBreed 변수에는 데이터 라인에서 개의 품종 뒤에 나타나는 원치 않는 문자가 포함될 수 있습니다. SAS가 space2를 만날 때까지 읽기만 하도록 하려면 정보에 콜론 수정자를 사용할 수 있습니다.

콜론 수식어를 사용하려면 정보 앞에 콜론(:)을 넣으면 됩니다(예: $20 대신 $20.).

 

 

 

My dog Sam Breed: Rottweiler Vet Bills: $478

 

 

 

 

웹 로그는 지저분한 데이터의 좋은 예입니다. 다음 데이터 라인은 웹의 일부입니다.

애견 관리 사업 웹사이트에 대한 로그입니다. 데이터 라인은 컴퓨터의 IP 주소로 시작합니다.

웹 페이지에 액세스한 다음 파일에 액세스한 날짜 및 파일 이름을 포함한 기타 정보가 표시됩니다.

 

 

 

 

130.192.70.235 - - [08/Jun/2001:23:51:32 -0700] "GET /rover.jpg HTTP/1.1" 200 66820
128.32.236.8 - - [08/Jun/2001:23:51:40 -0700] "GET /grooming.html HTTP/1.0" 200 8471
128.32.236.8 - - [08/Jun/2001:23:51:40 -0700] "GET /Icons/brush.gif HTTP/1.0" 200 89
128.32.236.8 - - [08/Jun/2001:23:51:40 -0700] "GET /H_poodle.gif HTTP/1.0" 200 1852
118.171.121.37 - - [08/Jun/2001:23:56:46 -0700] "GET /bath.gif HTTP/1.0" 200 14079
128.123.121.37 - - [09/Jun/2001:00:57:49 -0700] "GET /lobo.gif HTTP/1.0" 200 18312
128.123.121.37 - - [09/Jun/2001:00:57:49 -0700] "GET /statemnt.htm HTTP/1.0" 200 238
128.75.226.8 - - [09/Jun/2001:01:59:40 -0700] "GET /Icons/leash.gif HTTP/1.0"

 

 

 

 

파일에 액세스한 날짜와 파일 이름에 관심이 있습니다. 

IP 주소는 항상 같은 수의 문자가 아니며 날짜가 같은 문자로 정렬되지 않습니다.

항상 칼럼과 파일 이름이 열에 정렬되지 않을 뿐만 아니라 파일 이름은 매우 가변적입니다. 

다음은 이 파일을 읽을 수 있는 SAS 프로그램입니다.

 

 

 

DATA weblogs;
INFILE 'c:\MyWebLogs\dogweblogs.txt';
INPUT @'[' AccessDate DATE11. @'GET' File :$20.;
PROC PRINT DATA = weblogs;
TITLE ‘Dog Care Web Logs’;
RUN;

 

 

 

 

이 INPUT 문은 @'['를 사용하여 날짜를 읽을 열 포인터의 위치를 지정한 다음 @'GET'을 사용합니다.

파일 이름을 읽을 열 포인터의 위치를 지정합니다. 

파일 이름이 8보다 크므로 문자이지만 항상 같은 수는 아닙니다. 콜론 수정자가 있는 정보:$20. 파일 이름을 읽는 데 사용됩니다.

■ Reading Multiple Lines of Raw Data per Observation

원시 데이터 파일에서 각 데이터 행은 하나의 관측치를 나타내지만, 때때로 각 관측치에 대한 데이터가 둘 이상의 행에 걸쳐 분산됩니다.

INPUT 문의 모든 변수를 읽기 전에 데이터가 부족하면 SAS가 자동으로 다음 행으로 이동하므로, SAS가 새 행으로 이동할 시기를 파악하도록 할 수 있습니다. 

데이터 파일에 관찰당 여러 줄의 원시 데이터가 있다는 것을 알고 있다면 SAS에 언제 가야 하는지 명시적으로 알려주는 것이 좋습니다.

SAS가 알아내는 것보다 다음 행으로 넘어가야. 이렇게 하면 로그에서 SAS가 새 행으로 이동한 의심스러운 노트를 찾을 수 없습니다. SAS에 로 건너뛸 시기를 알려 주는 방법으로는 새 줄, 입력 문에 줄 포인터를 추가하기만 하면 됩니다.

선 포인터인 슬래시(/)와 파운드-n(#n)로 건너 뛸 시기를 표시할 수 잇습니다. 

단일 관측치에 대해 둘 이상의 원시 데이터를 읽으려면 원시 데이터의 다음 행으로 건너뛰고 싶을 때 INPUT 문에 슬래시를 넣기만 하면 됩니다. 

 

#n 라인 포인터는 라인 번호를 지정하는 것을 제외하고 동일한 작업을 수행합니다. n에서 #n은 해당 관측치에 대한 원시 데이터 선의 수를 나타냅니다. 따라서 #2는 해당 관측치에 대한 두 번째 선으로 이동한다는 의미이고 #4는 네 번째 선으로 이동한다는 의미입니다. 예를 들어 #n 라인 포인터를 사용하여 4번 라인에서 읽은 다음 3번 라인에서 읽은 다음 뒤로 이동할 수도 있습니다. 슬래시가 더 간단하지만 #n이 더 유연합니다.

 

 

 

Nome AK
55 44
88 29
Miami FL
90 75
97 65
Raleigh NC
88 68
105 50

 

 

 

예시를 통해 알아보겠습니다.

여름 휴가를 계획하기 위해 기상 데이터베이스로부터 데이터를 얻습니다.

위의 데이터는 알래스카, 플로리다, 노스캐롤라이나의 7월 온도에 대한 정보가 포함되어 있습니다. 

첫 번째 줄은 시와 주를 포함하고 두 번째 줄은 정상 고온 및정상 최저(화씨), 세 번째 줄에는 최고 및 최저 기록이 포함됩니다.

 

/* Read the data file using line pointers;*/
DATA highlow;
INFILE ’c:\MyRawData\Temperature.dat’;
INPUT City $ State $
/ NormalHigh NormalLow
#3 RecordHigh RecordLow;
PROC PRINT DATA = highlow;
TITLE ’High and Low Temperatures for July’;
RUN;

 

NPUT 문은 데이터의 첫 번째 줄에서 City 및 State에 대한 값을 읽습니다. 그런 다음

슬래시는 SAS에게 NormalHigh를 읽기 전에 다음 데이터 라인의 열 1로 이동하도록 지시합니다. 

마찬가지로 #3은 SAS에게 해당 데이터의 세 번째 라인의 열 1로 이동하도록 지시합니다.

RecordHigh 및 RecordLow를 읽기 전에 관찰하십시오. 평소와 같이 방법은 여러 가지가 있습니다.

이 INPUT 문을 작성하십시오. 슬래시를 #2로 바꾸거나 #3을 슬래시로 바꿀 수 있습니다.

■ Reading Multiple Obersevations per Line of Raw Data

SAS는 각 원시 데이터 라인은 하나 이상의 관찰을 나타내지 않습니다.

원시 행당 여러 관찰이 있는 경우 데이터의 경우 INPUT 문의 끝에 이중 후행 기호(@@)를 사용할 수 있습니다. SAS 프로그램에게 "그만, 원시 데이터 라인을 유지하십시오."라고 말하는 정지 신호와 같습니다. 다음 중 하나가 될 때까지 관찰을 계속 읽습니다.

휴가를 계획하는 동료가 있고 그가 고려 중인 세 도시의 강우량(인치) 데이터가 포함된 파일을 얻었다고 가정합니다.

파일에는 각 도시의 이름, 주, 7월 평균 강우량, 7월 평균 강우량 일수가 포함됩니다. 원시 데이터는 다음과 같습니다.

 

Nome AK 2.5 15 Miami FL 6.75
18 Raleigh NC . 12

 

데이터 파일에서 첫 번째 행은 두 번째 관찰의 중간에서 멈춥니다. 

다음 프로그램은 Precipitation.dat라는 파일에서 이러한 데이터를 읽고 @@ so SAS를 사용합니다.

각 관찰에 대한 원시 데이터의 새 행으로 자동으로 이동하지 않습니다.

 

 

DATA rainfall;
INFILE ’c:\MyRawData\Precipitation.dat’;
INPUT City $ State $ NormalRain MeanDaysRain @@;
PROC PRINT DATA = rainfall;
TITLE ’Normal Total Precipitation and’;
TITLE2 ’Mean Days with Precipitation for July’;
RUN;

 

 

 

■ Reading Part of a Raw Data File

큰 데이터 파일의 일부 레코드를 읽어야 할 수도 있습니다. 

예를 들어,미국 인구 조사 데이터를 읽고 있고 오직 여성 세대주이며, 연봉은 22만 5천 달러 이상, 워싱턴주 왈라왈라에 살고 있는 조건을 한정하여 데이터를 필터링 할 수 있습다

현재 관측치를 유지할지 여부를 결정한 다음 INPUT 문을 후, 앳 마크(@)로 끝낼 수 있습니다. 이는 SAS가 해당 원시 데이터 라인을 보유하도록 지시합니다. 후행 @이 해당 줄을 유지하는 동안 IF 문을 사용하여 관찰을 테스트하여 유지할 것인지 확인할 수 있습니다. 이 경우 두 번째 INPUT 문을 사용하여 나머지 변수에 대한 데이터를 읽을 수 있습니다. 

@가 없으면 SAS는 각 INPUT 문으로 원시 데이터의 다음 줄을 자동으로 읽기 시작합니다.

@은 열 포인터 @n과 유사합니다. 

@ 기호 뒤에 숫자를 지정하면 SAS가 특정 열로 이동하도록 지시합니다. 

고속도로에 대한 지역 교통 데이터가 포함된 원시 데이터 파일의 일부를 읽고 표면 거리, 데이터에는 거리 유형, 거리 이름, 평균에 대한 정보가 포함됩니다.

 

 

freeway                                408 3684 3459
surface Martin Luther King Jr. Blvd.   1590 1234
surface Broadway                       1259 1290
surface Rodeo Dr.                      1890 2067
freeway 608                            4583 3860
freeway 808                            2386 2518
surface Lake Shore Dr.                 1590 1234
surface Pennsylvania Ave.              1259 1290 

 

 

이 시점에서 고속도로 데이터만 보고 싶어 원시 데이터 파일을 읽는다고 가정해 보겠습니다.

 

 

/* Use a trailing @, then delete surface streets;*/
DATA freeways;
INFILE ’c:\MyRawData\Traffic.dat’;
INPUT Type $ @;
IF Type = ’surface’ THEN DELETE;
INPUT Name $ 9-38 AMTraffic PMTraffic;
PROC PRINT DATA = freeways;
TITLE ’Traffic for Freeways’;
RUN;

 

첫 번째는 문자 변수 Type을 읽은 다음 @로 끝납니다. @는 IF 문이 테스트하는 동안 데이터의 각 행을 유지합니다.

두 번째 INPUT 문은 Name(9-38열), AMTraffic 및 PMTraffic을 읽습니다.

관찰에 변수 Type에 대한 surface 값이 있는 경우 두 번째 INPUT 문은 실행되지 않습니다. 대신 SAS는 다음 관찰을 처리하기 위해 DATA 단계의 시작 부분으로 돌아가고 FREEWAYS 데이터 세트에 원치 않는 관찰을 추가하지 않습니다.

Version history
Last update:
‎08-28-2022 08:10 AM
Updated by:
Contributors

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

Article Labels
Article Tags