Re: [程式] SAS 資料整理問題?
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):