2013-12-11 4 views
0

У меня есть файл excel, который я импортировал в SAS, который содержит 3 переменные и 3 наблюдения.SAS 9.3 Сортировка данных по строкам

Все значения - это числа.


241247
993014
50541

Есть ли способ я могу закодировать так, чтобы каждая строка сортируется в порядке возрастания?


Результат будет выглядеть так:


122447
143099
54150


мне нужно сделать это для нескольких файлов первенствовать, которые содержат огромное количество переменных и наблюдений.
Спасибо.

ответ

4

Простым способом является использование CALL SORTN, который сортируется по строкам.

data have; 
input a b c; 
datalines; 
24 12 47 
99 30 14 
50 5 41 
; 
run; 

data have; 
modify have; 
call sortn(of _numeric_); 
run; 
0

Я бы использовал процедуру сортировки FCMP. Функции и подпрограммы FCMP позволяют передавать временные массивы для их модификации. Таким образом, вы должны назначить значения во временный массив, сортировать, а затем переназначать постоянные переменные.

Измените код ниже для количества колонок и имен столбцов.

options cmplib=work.cmp; 

proc fcmp outlib=work.cmp.fns; 
subroutine qsort(arr[*],lo,hi); 
    outargs arr; 
    i = lo; 
    j = hi; 
    do while (i < hi); 
     pivot = arr[floor((lo+hi)/2)]; 
     do while (i<=j); 
      do while (arr[i] < pivot); 
       i = i + 1; 
      end; 
      do while (arr[j] > pivot); 
       j = j - 1; 
      end; 
      if (i<=j) then do; 
       t = arr[i]; 
       arr[i] = arr[j]; 
       arr[j] = t; 
       i = i + 1; 
       j = j - 1; 
      end; 
     end; 
     if (lo < j) then 
      call qsort(arr,lo,j); 
     lo = i; 
     j = hi; 
    end; 
endsub; 
run; 
quit; 

data test; 
input a b c; 
datalines; 
24 12 47 
99 30 14 
50 5 41 
; 
run; 

%let ncol=3; 
%let cols = a b c; 
data sorted; 
set test; 
array vars[&ncol] &cols; 
/*Only temporary arrays can be passed to FCMP functions*/ 
array tmp[&ncol] _temporary_; 

/*Assign to tmp*/ 
do i=1 to &ncol; 
    tmp[i] = vars[i]; 
end; 
/*Sort*/ 
call qsort(tmp,1,&ncol); 
/*Put back sorted values*/ 
do i=1 to &ncol; 
    vars[i] = tmp[i]; 
end; 
drop i; 
run; 
0

Хотя есть пакет SAS/IML разработан специально для манипуляций с матрицами (где, по моему мнению, эта задача была бы тривиальной), он все еще может быть сделано с SAS Base, используя пару Procs заворачивают в макро петли ,

data raw; 
input a b c; 
datalines; 
24 12 47 
99 30 14 
50 5 41 
; 
run; 

proc transpose data=raw out=raw_t(drop=_:); run; 

proc sql noprint; 
    select name into :vars separated by ' ' 
    from sashelp.vcolumn 
    where libname='WORK' and memname='RAW_T'; 
quit; 

%macro sort_rows; 
%do i=1 %to %sysfunc(countw(&vars)); 

    proc sort data=raw_t(keep=%scan(&vars,&i)) out=column; 
     by %scan(&vars,&i); 
    run; 

    data sortedrows;     
     %if &i>1 %then set sortedrows;; 
     set column; 
    run; 
%end; 
%mend sort_rows; 
%sort_rows 

proc transpose data=sortedrows out=sortedrows(drop=_:); run; 

Во-первых, вы перенесите свой исходный набор данных.

Затем вы перебираете все столбцы (которые были изначально изначально), сортируя их и соединяя друг с другом.

И, наконец, перенести все обратно.

Смежные вопросы