作者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/cn.aspx?n=bbs/Statistics/M.1626110701.A.E03.html
1F:推 Meidien: 的确这样换id一定就抓得到,感谢!!! 07/13 08:14