作者chien533 (谣指部总司令)
站内Statistics
标题Re: [程式] SAS 字串搜寻
时间Sun May 10 14:23:19 2015
※ 引述《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://webptt.com/cn.aspx?n=bbs/Statistics/M.1431239001.A.293.html
※ 编辑: chien533 (72.191.32.43), 05/10/2015 14:24:01
1F:推 LinRungChuan: 可以了 感谢, 学到新东西了 call symput 跟 scan 05/11 04:52
2F:→ LinRungChuan: 都是第一次使用! 05/11 04:52