2010-04-19 17 views
8

W SAS 9, jak mogę w prostym kroku danych, zmienić kolejność pól.SAS: zmienić kolejność pól w kroku danych

Data set2; 
    /*Something probably goes here*/ 
    set set1; 
run; 

Więc jeśli set1 ma następujące pola:

Name Title Salary 
A  Chief 40000 
B  Chief 45000 

Wtedy mogę zmienić kolejność pól zb2 do:

Title Salary Name 
Chief 40000 A 
Chief 45000 B 

Dzięki,

Danowi

+1

można dodać trochę więcej informacja, dlaczego chcesz to zrobić? Jeśli chodzi o formatowanie/drukowanie, myślę, że możesz sobie z tym poradzić z proc print ... – mcpeterson

Odpowiedz

5

Jeśli masz bardzo dużą liczbę zmiennych w zbiorze danych czasami łatwiej jest używać sql zamiast datastep. Dzięki temu możesz wyświetlić tylko te zmienne, których kolejność dotyczy, i używać symboli wieloznacznych, aby zachować wszystko inne.

proc sql noprint; 
    create table set2 as 
    select title, salary, * 
    from set1; 
quit; 

Jeśli robisz to z dużą tabelą, możesz zaoszczędzić sobie na obciążeniu IO, tworząc zamiast tego widok. Może to być stosowane zarówno w podejściu do zbioru danych, jak i w podejściu proc sql.

proc sql noprint; 
    create view set2 as 
    select title, * 
    from set1; 
quit; 

** OR; 

data set2/view=set2; 
    retain title salary name; 
    set set1; 
run; 

Cheers Rob

+1

Dla jasności, wszystkie metody wymienione w linku dostarczonym przez @mcpeterson mają również zachowanie, które przypisujesz PROC SQL - nie trzeba określ porządek wszystkich zmiennych w zbiorze danych, tylko te, które są interesujące. Reszta jest nadal przechowywana (chyba, że ​​podano inaczej w innym miejscu). – user667489

3

Można również użyć INFORMAT oświadczenie to zrobić - nie ma potrzeby dodawania jakichkolwiek informats. Podejrzewam, że jest to nieco bardziej wydajne niż równoważne polecenie retain, ponieważ pozwala SAS zainicjować wartości jako brakujące, zamiast pobierać je z poprzedniego wiersza. W praktyce różnica jest minimalna, a Ty masz również możliwość korzystania z widoku.

data set2; 
    informat title salary name; 
    set set1; 
run; 

Zmienne wymienione w sprawozdaniu informat są przesunięte w lewo w zbiorze i do tego celu, a resztę pozostawiono, gdyż były one w zbiorze danych wejściowych.

+0

SAS nie działa tak, jak myślisz, jeśli chodzi o zachowanie, a nie zachowanie. RETAIN nie pobiera wartości z poprzedniego wiersza; w rzeczywistości powoduje to, że SAS nie ustawił zmiennej na brak pomiędzy iteracjami, więc gdyby istniała różnica w działaniu tego rozwiązania informatycznego, byłaby szybsza, a nie wolniejsza. Podejrzewam, że różnica między nimi jest zerowa, ponieważ SAS zrobiłby dokładnie to samo w obu przypadkach (zdefiniuj zmienną w PDV i zatrzymaj się). – Joe

+0

Tak, trochę się mylę.Uważam jednak, że nadal istnieje argument dotyczący informowania o zachowaniu, ponieważ ten pierwszy powoduje mniejsze prawdopodobieństwo niezamierzonego zachowania, np. jeśli źródłowy zbiór danych zawiera brakujące wartości. – user667489

+0

Wstępnie się z tobą zgadzam, oczekując na przypomnienie, dlaczego prawie nikt nie używa w ten sposób 'informat' (lub' format'), a prawie wszyscy używają 'zatrzymania', pomimo potencjalnego niezamierzonego wpływu ... – Joe

0

osobiście używam oświadczenie attrib - następująco:

data set2; 
    attrib title salary name label=''; 
    set set1; 
run; 

Zupełnie jak podejście informat chociaż (bardziej prawdopodobne, że potrzebują potrzebują etykietę niż informacji w ko)

Powiązane problemy