Re: [程式] SAS 資料整理問題?

看板Statistics作者 (謠指部總司令)時間9年前 (2015/05/03 14:08), 9年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《andersonhaha (好山好水 多健康)》之銘言: : 請問在 SAS 資料中,1997~2004 原始資料-> 預整理成的資料: : id year data id year data : 1 1997 0 : 1 1998 0 (第一次數值前,都設定0) : 1 1999 1 1 1999 1 : 1 2000 1 (補上2000,2001=1) : 1 2001 1 : 1 2002 2 1 2002 2 (2002=2 之後都設定2) : 1 2003 1 1 2003 2 : 1 2004 1 1 2004 2 : 1. 2002=2 第一次出現最大值,之後都設定為 2 : 我用 proc expand: transformin=(movmax ) 這樣可以嗎? : 2. 第一次數值之前都設定為0 : 第一次出現的數值可能 1 or 2, 之前都設為0. 是取 first.id year? : 3. 第一個 1 and 第一個2 之間,如何補上年份,設定為1? : 謝謝各位幫忙! 我猜你的資料應該有數個id,不會只有一個id=1,因為若只有一個id的話問題就很簡單 但我假設你有三個id,並且最大值有可能跳到3的情況: data temp1; input id year data; cards; 1 1999 1 1 2002 2 1 2003 1 1 2004 1 2 1998 1 2 2001 2 2 2002 1 2 2003 1 3 2000 1 3 2002 2 3 2003 3 run; 首先解決插補missing year和0的問題,若每個id的年份長度一樣,那就先開一個模版: data temp2; do id = 1 to 3; do year = 1997 to 2004; data = 0; output; end; end; run; 然後把原始資料併入到這個模版裡面,並且用lag function來位移數值: data temp3; /*先依照id和year合併資料*/ merge temp2 temp1; by id year; /*用data變數和lag function生出七個遞延資料lag1~lag7,由於遞延後下一個id*/ /*的第一個值會變成上一個id的最後一個值,所以每生出一個lag變數就要把第一*/ /*年(1997)的值變成missing*/ array a[7] lag1-lag7; do i = 1 to 7; if i = 1 then lag1 = lag(data); else a[i] = lag(a[i-1]); if year = 1997 then a[i] = .; end; /*然後把data, lag1~lag7這八個變數求最大值,結果就是你要的*/ data_new = max(of data--lag7); /*lag1~lag7以及迴圈index功成身退,刪除!*/ drop lag1--i; run; -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 72.191.32.43 ※ 文章網址: https://www.ptt.cc/bbs/Statistics/M.1430633324.A.C02.html ※ 編輯: chien533 (72.191.32.43), 05/03/2015 14:09:24

05/05 22:04, , 1F
謝謝您的幫忙!
05/05 22:04, 1F
文章代碼(AID): #1LHRjim2 (Statistics)
文章代碼(AID): #1LHRjim2 (Statistics)