作者west1996 ()
看板Statistics
標題Re: [程式] SAS刪除substring重複的樣本
時間Tue Jul 13 01:24:57 2021
※ 引述《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://webptt.com/m.aspx?n=bbs/Statistics/M.1626110701.A.E03.html
1F:推 Meidien: 的確這樣換id一定就抓得到,感謝!!! 07/13 08:14