2013-11-17 5 views
2
proc sort data=sas.mincome; 
    by F3 F4; 
run; 

Сортировка Proc не сортирует данные по форматированным значениям, а только внутренним значениям. Мне нужно сортировать по двум переменным до слияния. Есть ли способ сделать это с помощью сортировки proc?Как сортировать по форматированным значениям

ответ

4

Я не думаю, что можно сортировать по отформатирован значения в Proc рода, но вы определенно можете использовать простую процедуру прок SQL для сортировки набор данных по форматированным значениям. proc SQL похож на шаг данных и proc sort, но более мощный.

Общий синтаксис Proc SQL для сортировки по отформатированным значениям будет:

proc sql; 
    create table NewDataSet as 
    select variable(s) 
    from OriginalDataSet 
    order by put(variable1, format1.), put(variable2, format2.); 

quit; 

К примеру, у нас есть набор образцов данных, содержащие имена, пол и возраст некоторых людей, и мы хотим, чтобы отсортировать их :

proc format; 
    value gender 1='Male' 
       2='Female'; 
    value age 10-15='Young' 
       16-24='Old'; 
    run; 


data work.original; 
    input name $ sex age; 
    datalines; 
    John 1 12 
    Zack 1 15 
    Mary 2 18 
    Peter 1 11 
    Angela 2 24 
    Jack 1 16 
    Lucy 2 17 
    Sharon 2 12 
    Isaac 1 22 
    ; 
run; 

proc sql; 
    create table work.new as 
    select name, sex format=gender., age format=age. 
    from work.original 
    order by put(sex, gender.), put(age, age.); 
quit; 

Выход work.new будет:

       Obs  name  sex  age 

           1  Mary  Female Old 
           2  Angela Female Old 
           3  Lucy  Female Old 
           4  Sharon Female Young 
           5  Jack  Male  Old 
           6  Isaac  Male  Old 
           7  John  Male  Young 
           8  Zack  Male  Young 
           9  Peter  Male  Young 

Если бы мы использовали процедурный сортировать по полу, то самцы заняли бы первое место, потому что мы использовали 1 для представления мальчиков и 2 для представления женщин, которых мы не хотим. Таким образом, мы можем ясно видеть, что proc sql действительно сортировал их в соответствии с форматированными значениями (Females first, Males second).

Надеюсь, это поможет.

+0

Да, я понял это немного после размещения вопроса. Спасибо, хотя (снова). – user108431

1

Из-за природы форматов SAS использует только базовые значения для сортировки. Насколько мне известно, вы не можете изменить это (если вы не хотите создавать свою собственную таблицу переводов через PROC TRANTAB).

Что вы можете сделать, это создать новый столбец, содержащий форматированное значение. Затем вы можете сортировать по этой колонке.

proc format library=work; 
    value $test 'z' = 'a' 
       'y' = 'b' 
       'x' = 'c'; 
run; 

data test; 
format val $test.; 
informat val $1.; 
input val $; 

val_fmt = put(val,$test.); 
datalines; 
x 
y 
z 
; 
run; 

proc print data=test(drop=val_fmt); 
run; 

proc sort data=test; 
by val_fmt; 
run; 

proc print data=test(drop=val_fmt); 
run; 

Производит

        Obs val 

            1  c 
            2  b 
            3  a 

        Obs val 

            1  a 
            2  b 
            3  c 
Смежные вопросы