看板 Statistics 關於我們 聯絡資訊
※ 引述《Meidien (學海無涯回頭是岸)》之銘言: : [軟體程式類別]:SAS : [程式問題]:資料處理 : [軟體熟悉度]:熟悉 : [問題敘述]: : 大家好,遇到一個資料處理的問題查不太到解法,來請教各位前輩。 : 我有一組資料長的像下面這樣: : data have; : input ObsName $; : cards; : EDZ : ED : E : EDCBA : EDFBA : EDFB : EDY : ; : run; : 其中,某個obs可能是另一個obs的子字串,例如ED是EDZ、EDCBA等的子字串, : 我需要做的是如果某個obs是另一obs的子字串,那麼只保留較長的那一個。 : 換句說話,想要把have變成下面的資料集: : EDZ : EDCBA : EDFBA : EDY : 我目前是試著sort by ObsName,並且加上長度變數會得到: : ObsName Length : E 1 : ED 2 : EDCBA 5 : EDFB 4 : EDFBA 5 : EDY 3 : EDZ 3 : 感覺從length找local maximum之類的好像可行,但是不確定是不是會遇到例外狀況, : 這個方法感覺很土法煉鋼,不知道位各前輩是否有比較好的做法,還請不吝指教,謝謝。 用local maximum可能需要注意半山腰高原的狀況,但硬做應該也有機會。 不過既然sorting的時間不是問題了,下面這個方法感覺更安全一點(盲打,沒debug) 假設資料已排序 data new; set old(rename=(obsname=obsname_origin)) end=last; length obsname $ 32767; /*長度換成原本obsname變數長度*/ retain obsname; if _n_=1 then obsname=obsname_origin; else do; if substr(obsname_origin,1,length(obsname))=obsname then do; obsname=obsname_origin; end; else do; output; obsname=obsname_origin; end; end; if _n_^=1 and last=1 then output; drop obname_origin; run; 希望沒打錯 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.227.173.195 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Statistics/M.1626110701.A.E03.html
Meidien: 的確這樣換id一定就抓得到,感謝!!! 07/13 08:14