2011-12-29 206 views
1

我有以下問題:重新排序列在SAS

我有一個表,看起來像這樣:

WEIGHT DATE 8/1/11 1/1/11 5/1/11 ... 10/25/11 
NAME CLASS 
NICK  1  A   .  A  . 
JOHN  1  c+   C-  .  B- 
JOHN  2  A   .  .  . 
MIKE  2  B   B  B+  A 
BOB  3  D   C  C   . 
... 

的日期是隨機的日期,他們是沒有順序的。

我想在sas中訂購我的日期(我的專欄)。我在谷歌上查了一些東西,但沒有什麼特別的問題,因爲我有300個日期,因此有300個列名。

爲您的信息:

我的數據原本是這樣的:

CALENDAR1:

NAME CLASS CALENDaRDATE GPA 
JOHN 1  1/1/11  C- 
JOHN 1  8/1/11  C+ 
... 

而且我用這個PROC創建我的表:

proc sort data=calendar1; 
     by NAME ClASS CALENDARDATE; 
    run; 

    PROC TRANSPOSE DATA = calendar1 OUT = calendar2 ; 
     BY nAME cLASS; 
     VAR GPA; 
     ID CALeNdaRDATE; 
    RUN ; 

待辦事項你有關於如何按日期排序我的列的想法?

+0

遷移到SO,因爲這是關於Stats的主題。 – whuber 2011-12-29 13:40:06

回答

5

這是供您參考不那麼優雅的解決方案(有些是從CarolinaJay65的輸入借用) 。您可以使用RETAIN語句對列進行重新排序。

我不認爲你可以保留像'5/1/11'這樣的列名,因爲SAS不允許在列名中使用「/」。第一個字符也不能是數字。

data work.calendar1 (drop=dt); 
input name $ class $ dt $ gpa $; 
calendardate=mdy(scan(dt,1),scan(dt,2),scan(dt,3)); 
    format calendardate mmddyy10.; 
datalines; 
JOHN 1  1/1/11  C- 
JOHN 1  8/1/11  C+ 
JOHN 1  10/25/11 B- 
JOHN 2  8/1/11  A 
NICK 1  8/1/11  A 
NICK 1  5/1/11  A 
MIKE 2  8/1/11  B 
MIKE 2  1/1/11  B 
MIKE 2  5/1/11  B+ 
MIKE 2  10/25/11 B 
BOB 3  10/25/11  D 
BOB 3  1/1/11  C 
BOB 3  5/1/11  C 
; 

proc sort data=work.calendar1; 
by NAME ClASS CALENDARDATE; 
run; 

PROC TRANSPOSE DATA = calendar1 OUT = calendar2(drop=_name_) ; 
BY nAME cLASS; 
VAR GPA; 
ID CALeNdaRDATE; 
RUN ; 

proc sort data=calendar1(keep=CALENDARDATE) out=datecol nodupkey; 
by CALENDARDATE; 
run; 

data datecol; 
set datecol; 
format col $11.; 
col=cats('_',tranwrd(put(CALENDARDATE,mmddyy10.),'/','_')); 
run; 

proc sql; 
select col into :x separated by ' ' from datecol; 
quit; 

data calendar2; 
retain name class &x; 
set calendar2; 
run; 
+1

尼斯..我試着用PROC SQL的東西,因爲你得到設置的VAR順序創建的數據集,但忘記了RETAIN語句。在企業指南中,VALIDVARNAME的默認(至少在我的商店中)選項是ANY ...所以PROC TRANSPOSE不會在日期值中自動替換「_」作爲「/」。一旦我設置VALIDVARNAME = v7,它對我有用。好的解決方案+1 – 2011-12-30 02:51:43

+0

@ carolinaJay65 +1對你來說,我在sASEG上工作,並使用ValidVarname = v7完美工作! – 2011-12-30 09:05:06

+0

@Robbie Liu非常感謝,如果您有時間可以提供一些詳細信息(或鏈接),以幫助我瞭解保留聲明在這種特定情況下的行爲。 – 2011-12-30 09:06:14

1

在SORT和TRANSPOSE過程之前,嘗試將CALENDARDATE轉換爲SAS日期。您可以在數據導入中進行日期轉換。

此代碼似乎做你想要的...(但它是一個小樣本)

data work.calendar1 (drop=dt); 
input name $ class $ dt $ gpa $; 
calendardate=mdy(scan(dt,1),scan(dt,2),scan(dt,3)); 
format calendardate mmddyy10.; 
datalines; 
JOHN 1  1/1/11  C- 
JOHN 1  8/1/11  C+ 
JOHN 1  10/25/11 B- 
JOHN 2  8/1/11  A 
NICK 1  8/1/11  A 
NICK 1  5/1/11  A 
MIKE 2  8/1/11  B 
MIKE 2  1/1/11  B 
MIKE 2  5/1/11  B+ 
MIKE 2  10/25/11 B 
BOB 3  8/1/11  D 
BOB 3  1/1/11  C 
BOB 3  5/1/11  C 
; 

proc sort data=work.calendar1; 
by NAME ClASS CALENDARDATE; 
run; 

PROC TRANSPOSE DATA = calendar1 OUT = calendar2(drop=_name_) ; 
BY nAME cLASS; 
VAR GPA; 
ID CALeNdaRDATE; 
RUN ; 
+0

它不起作用,如果你用這個替換了最後3行(帶有bob):'BOB 3 10/25/11 D',你會看到日曆中的第一個日期是2011年10月25日。你的例子工作,因爲在排序表中日曆日期「到達」在正確的順序。 1/1然後5/1然後8/1(然後1/1)(然後8/1),然後(10/25) – 2011-12-29 17:38:39