2014-03-25 6 views
1

이제 주요 관심 변수 2 개 (Major 및 Major_Code)가있는 데이터 세트가 있습니다. 이것들은 1 대 1과 일치해야하지만, 수정해야 할 몇 가지 오류가 있습니다. 그리고 내가 발견 한 것은 14 가지 Major_Code 값에 대해 두 개의 다른 전공이 있다는 것입니다. 이것은 "에드."와 같이 철자 또는 구두점이 변경된 경우에만 발생합니다. 및 "교육". 그들은 여기에 같은 가치를 가지고 있지만 그렇게하지 말아야합니다.SAS는 하나의 관측 값을 사용하여 다른 관측 값을 덮어 씁니다.

그래서 7 쌍의 테이블이 있습니다. 각 쌍은 Major_Code가 같고 Major가 다릅니다. 각 코드에 사용할 주요 값 중 하나를 선택하려면 어떻게합니까? 나의 유일한 생각은 if-then 진술을 통해서 였지만, 그것은 무시 무시하게 비효율적 인 것처럼 보인다.

난과 같이 배 값 발견

PROC 주파수 데이터 = majorslist 단계; 테이블 Major_Code/out = majorcodedups; 실행;

proc 인쇄 데이터 = majorcodedups; 여기서 COUNT> 1; 실행;

그래서 나는이 관측치를 쉽게 찾을 수 있지만 다른 관측치에 덮어 쓰기 위해 특정 값을 추출 할 수는 없습니다. 나는 배열, 매크로, SQL과 조바꿈을 들여다 보았다.하지만 지금은 내 머리 위로 조금이다.

논리적으로는 다음과 같이 작동 것이다 :

을 OBS에서 제가 N, 난 OBS I에서 변수 Y 상 출력 값이 이전 기지국 (I + 1)를 반복 이동 OBS에서 변수 x의 값을 찾기.

+0

"중요한"값의 선택 방법을 결정하는 것이 중요합니다. 나머지는 쉽습니다. – Joe

답변

0

당신이 주요이 MAJOR_CODE에 대한 올바른 결정하기위한 몇 가지 규칙이 가정하면,이 작업을 수행해야합니다

majorslist을 가정하는 것은 모든 주요/major_code 쌍 여부의 데이터 집합입니다 독특한 여부 - 그러나 주요 당 하나/major_code 쌍.

proc sort data=majorslist; 
by major_code major; 
run; 

data majorslist_unique; 
set majorslist; 
by major_code major; 
if first.major_code and last.major_code then output; 
else do; 
*rule to determine whether to output it or not; 
end; 
run; 

이제 major_code/major relationship이 생겼습니다. 규칙으로 if first.major_code then output;을 골랐다 고 가정 해 봅시다 (예 : 알파벳순으로 첫 번째 주요 값으로 major_code 가져 오기).

이제 더 큰 데이터 세트에 적용해야합니다. 이를 수행하는 데는 여러 가지 방법이 있습니다.이 방법을 병합하는 것이 하나입니다. 형식은 또 다른 방법입니다. 형식은 다음과 같이 작동합니다.

FMTNAME, START, LABEL으로 데이터 집합을 만듭니다. MAJOR_CODE의 각 값에 대해 한 행을 구성하십시오. 여기서 STARTMAJOR_CODE이고 LABELMAJOR입니다. 불일치를 어떻게 처리해야하는지에 대한 추가 행을 추가합니다 (major_code의 새 값을 얻는 경우).

data for_fmt; 
set majorslist_unique; 
fmtname='MAJORF'; *add a $ if MAJOR_CODE is a character variable; 
start=major_code; 
label=major; 
output; 
if _n_=1 then do; 
    hlo='o'; 
    call missing(start); 
    label='NONMATCHED'; 
    output; 
end; 
keep fmtname start label hlo; 
run; 

proc format cntlin=for_fmt; 
quit; 

지금 당신은 당신이 PUT 문에서 사용할 수있는, 형식, MAJORF. (또는 $MAJORF. MAJOR_CODE 문자 인 경우)가 있습니다.

data my_bigdata2; 
set my_bigdata; 
major = put(major_code,MAJORF.); 
run; 
+0

대단히 감사합니다! 나는 거의 아이디어를 얻는다. 나는 코드를 즉시 깨뜨리지 않고 실행하려고합니다.하나의 major_code가 철자법 문제로 인해 2 개의 전공과 일치 할 수 있다고 분명하게 설명했는지는 모르지만 두 개의 major_code 값은 하나의 전공과 일치하지 않습니다. 오류는 확실히 한 가지 방법입니다. 필자가 몰랐던 주된 트릭은 first.id 참조를 정렬하고 사용하는 것이었고, 모든 major_codes에서 두 쌍의 선택 사항 중 하나를 출력 할 수있었습니다. 정렬 후 내부 그룹에 대해 행동 할 수 있다면 정말 강력합니다. 다시 감사합니다 :) – user137698

관련 문제