Re: [程式] SAS IF/ELSE RETAIN 觀念問題

看板Statistics作者 (咖啡王子)時間14年前 (2012/01/29 00:40), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/3 (看更多)
※ 引述《bbearh (go)》之銘言: : 又來請教板上大大. : 有關data process 過程, : 本覺得已經懂了. 但是有時結果仍不是我想像的. : 如果可能的話, 幫我解釋這樣寫為什麼不對. : data ddd; : input id name$ vol ; : cards; : 1 A 10 : 1 A 12 : 1 A 9 : 1 A 3 : 2 B 4 : 2 B 5 : 2 B 6 : 2 B 7 : 8 C 1 : 8 C 1 : 8 C 1 : ; : run; : *算分組累積和; : data eee; : set ddd; : retain acc 0; : * acc=-10000; : if id^=lag(id) then do; : acc=vol; : end; : else if id=lag(id) then : acc=acc+vol; : else : acc=-999; <--- 第2 row 為何會跑到這case : run; : * if else then do end 這樣寫沒錯吧! 已被data弄得沒什麼信心 : * retain 的使用目的是什麼? 覺得自己的觀念還是模糊的. : --------------------------------- 基本上 if then do end的觀念都沒錯 retain 的觀念也對 但是就差在 retain這個語法 本身就是保留數值給下一個觀察值使用 本身已經具有lag function的意味在 當你在if then 的語法中使用了 lag function來改變時 會變成 跳兩個觀察值使用 retain imply one lag (就我個人使用的看法) 因此 要下條件 通常都針對 第一個數據做調整即可 data eee; set ddd; retain acc 0; acc=acc+vol; if id^=lag(id) then acc=vol; run; 以這樣來做 acc會不斷累加 但是滿足 id^=lag(id)時 就會回到vol值重新計算 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.250.118.48

01/29 10:45, , 1F
所以真的會跳兩個觀察值, 以後要避免這種寫法. THANKS
01/29 10:45, 1F
文章代碼(AID): #1F92Jm8L (Statistics)
文章代碼(AID): #1F92Jm8L (Statistics)