2016-11-30 7 views
0

У меня есть набор данных, переменные которого представляют собой два вида информации: переменное измерение и категорию.SAS: отдельные переменные измерения Condense в категории

Например, Var1A измеряет первую переменную (например, кровяное давление) категории A (например, мужской/женский), тогда как Var2B измеряет вторую переменную (например, сердечный ритм) категории B (например, мужчина/женщина) ,

Key Var1A Var2A Var1B Var2B 
--- ----- ----- ----- ----- 
002 1  2  3  4 
031 5  6  7  8 
028 9  10 11 12 

Мне нужна каждая переменная измерения для уплотнения по типу категории.

Key Type Var1 Var2 
--- ---- ---- ---- 
002 A 1 2 
002 B 3 4 
028 A 9 10 
028 B 11 12 
031 A 5 6 
031 B 7 8 

Сортировка сжатого набора данных для меня не имеет значения.


То, что я придумал, и дает наборы данных, указанные выше. Я в основном грубо вынуждал/искажал свой путь к этому решению. Однако я задаюсь вопросом, существует ли более прямой/интуитивно понятный способ сделать это, возможно, без необходимости сортировать сначала и отбрасывать так много переменных.

data have; 
    input key $ @@ Var1A Var2A Var1B Var2B; 

    datalines; 
    002 1 2 3 4 
    031 5 6 7 8 
    028 9 10 11 12 
    ; 
run; 

proc sort data = have out = step1_sort; 
    by key; 
run; 

proc transpose data = step1_sort out = step2_transpose; 
    by key; 
run; 

data step3_assign_type_and_variable (drop = _NAME_); 
    set step2_transpose ; 

    if  _NAME_ = 'Var1A' then do; 
     variable = 'Var1'; 
     type = 'A'; 
    end; 
    else if _NAME_ = 'Var1B' then do; 
     variable = 'Var1'; 
     type = 'B'; 
    end; 
    else if _NAME_ = 'Var2A' then do; 
     variable = 'Var2'; 
     type = 'A'; 
    end; 
    else if _NAME_ = 'Var2B' then do; 
     variable = 'Var2'; 
     type = 'B'; 
    end; 
run; 

proc transpose data = step3_assign_type_and_variable 
       out = step4_get_want (drop = _NAME_); 
    var col1; 
    by key type; 
    id variable; 
run; 

ответ

0

я пришел с тем же способом, за исключением замены вашей грубой силы с более чистыми подстрок:

** use this step to replace your brute force code **; 
data step3_assign_type_and_variable; set step2_transpose; 
    type = upcase(substr(_name_,length(_name_),1)); 
    variable = propcase(substr(_name_,1,4)); 
    drop _name_; 
run;