Re: [程式] SAS 字串搜尋
※ 引述《LinRungChuan (吉他手)》之銘言:
: ------------------------------------------------------------------------
: [軟體程式類別]:SAS
: [程式問題]:資料處理
: [軟體熟悉度]:一年
: [問題敘述]:
: 有兩張table (table A 跟table B)
: 每張各有一個column (SubStr 在table A 跟 FullStr 在table B)
: SubStr 裡面的資料 有些會是 FullStr 的部分字元, 該如何取出這些observation
: 例如,
: SubStr FullStr
: abc pabcp
: def ppdefppp
: ghi pjklp
: abcp
: ppppabcpp
: pmnop
: defppp
: 我想取出的資料為
: pabcp
: ppdefppp
: abcp
: ppppabcpp
: defppp
: 若是單一 一個幾串 我都用index找, 例如index(FullStr, 'abc')
: 但一整個column index好像 不管怎麼回傳都是0, 也試過 用string array
: 把array放到 index裡面 例如index(FullStr, Arr{1}) 但也是回傳0
: 有人知道 用啥方式可以達到我要的table嗎
: 感謝
: -----------------------------------------------------------------------------
關鍵是那個當索引的Substr資料要轉置成橫的並且變成一個巨集變數:
data temp1;
input SubStr $;
cards;
abc
def
ghi
;
proc transpose data=temp1 out=temp1_t; var SubStr; run;
data temp1_t;
set temp1_t;
string = catx(" ", of col1-col3);
call symput('string', string);
run;
然後把他丟進主檔,利用scan變數去一個個把巨集變數裡面的各個索引抓出來跟每一個
主檔的資料作比對,並且分別存在不同的新變數裡面。然後把這些新變數加總,當總和
出現零的時候變數那筆資料沒有任何一部份的字串出現在索引裡面,因此可以刪除:
data temp2;
input FullStr $;
cards;
pabcp
ppdefppp
pjklp
abcp
ppppabcpp
pmnop
defppp
;
data temp3;
set temp2;
string="&string";
array a[3] idx1-idx3;
do i = 1 to 3;
a[i] = index(fullstr, scan(string, i));
end;
if mean(of idx1-idx3) ne 0;
drop idx1-idx3 i;
run;
這個作法有一個限制就是當索引轉置合併後太長,超過SAS容許的字串最大長度的話,
就必需要把索引拆成數份來分別處理。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 72.191.32.43
※ 文章網址: https://www.ptt.cc/bbs/Statistics/M.1431239001.A.293.html
※ 編輯: chien533 (72.191.32.43), 05/10/2015 14:24:01
推
05/11 04:52, , 1F
05/11 04:52, 1F
→
05/11 04:52, , 2F
05/11 04:52, 2F
討論串 (同標題文章)