2013-04-17 4 views
0

다른 사람들/악기가 만든 일련의 판독 값으로 구성된 데이터 세트가 여러 차원 있습니다. 그것은 다음과 같습니다다른 사람을 비교하여 새 변수 만들기

SUBJECT DIM1_1 DIM1_2 DIM1_3 DIM1_4 DIM1_5 DIM2_1 DIM2_2 DIM2_3 DIM3_1 DIM3_2 
1  1  .  1  1  2  3  3  3  2  . 
2  1  1  .  1  1  2  2  3  1  1 
3  2  2  2  .  .  1  .  .  5  5 
...  ... ... ... ... ... ... ... ... ... ... 

내 실제 데이터 세트가 각각

최대 5 개 대책, 약 190 치수를 포함 나는 각 차원에 대한 새로운 변수를 생성하는 일련의 규칙을 준수해야합니다 :

  • 동일한 차원 (누락 된 누락)에 2 개의 다른 값이있는 경우 새 변수가 누락됩니다.
  • 모든 값이 같은 경우 (누락 된 누락) 새 변수는 동일한 값을 사용합니다.

나의 새로운 변수는 다음과 같아야합니다

SUBJECT ... DIM1_X DIM2_X DIM3_X 
1  ... .  3  2 
2  ... 1  .  1 
3  ... 2  1  5 

여기서 문제는 내가 각 차원에 대한 조치의 같은 번호가없는 것입니다. 또한, 나는 단지 IF의 많은 (와 차원의 더 많은 조치로 비교의 수를 증가), 그래서이 특정 문제를 처리하는 몇 가지 쉬운 방법이 있는지 궁금해 많이, 뜻이 떠오를 수 있습니다.

도움이 필요하십니까? 미리 감사드립니다.

답변

2

가장 쉬운 방법은 수직으로 (DIMx_y 당 한 행) 전 환하고 요약 한 다음 놓치기를 원하는 것으로 설정 한 다음 다시 병합 (필요할 경우 다시 병합)입니다.

data have; 
input SUBJECT DIM1_1 DIM1_2 DIM1_3 DIM1_4 DIM1_5 DIM2_1 DIM2_2 DIM2_3 DIM3_1 DIM3_2; 
datalines; 
1  1  .  1  1  2  3  3  3  2  . 
2  1  1  .  1  1  2  2  3  1  1 
3  2  2  2  .  .  1  .  .  5  5 
;;;; 
run; 

data have_pret; 
set have; 
array dim_data DIM:; 
do _t = 1 to dim(dim_Data); *dim function is not related to the name - it gives # of vars in array; 
dim_Group = scan(vname(dim_data[_t]),1,'_'); 
dim_num = input(scan(vname(dim_data[_t]),2,'_'),BEST12.); 
dim_val=dim_data[_t]; 
output; 
end; 
keep dim_group dim_num subject dim_val; 
run; 

proc freq data=have_pret noprint; 
by subject dim_group; 
tables dim_val/out=want_pret(where=(not missing(dim_val))); 
run; 

data want_pret2; 
set want_pret; 
by subject dim_Group; 
if percent ne 100 then dim_val=.; 
idval = cats(dim_Group,'_X'); 
if last.dim_Group; 
run; 

proc transpose data=want_pret2 out=want; 
by subject; 
id idval; 
var dim_val; 
run; 
+0

대단히 감사합니다. 그게 정확히 내가 찾던 것이 었습니다. – Rub

관련 문제