有接觸資料的捧由,應該有看過一種coding方式是將數值/文字連結在同一個欄位

例如一位研究員將一位個案在五次不同時間測量的血壓值輸入到excel檔案中

「128,130,122,140,126」

在實際納入分析時,比方說計算五次血壓平均

這欄位總得要解開成為五列數值吧!

參考過SAS help後,以下說明將以這串品牌名稱作範例

分享作法一給各位,如果有其他方法也歡迎提供討論

string=ASUS,CORSAIR,GIGABYTE,MSI,ACER,BlackBerry,intel,Shuttle

目標是將該字串依照逗號解開成為8個rows

關於字串處理的函數,用力回想後跑出了:SCANCOMPRESSFINDCAT等相關函數

其中,掃描一個字串、指定位置後並且輸出的功能,非SCAN莫屬

SCAN函數範例:string=’ABC.DEF(X=Y)’;  word=scan(string, 3); 執行後的word值為X=Y

但是,SCAN還不足以解決現在的問題

因為需要逗點分隔之間的所有單字,沒錯吧!

介紹一個CALL ROUTINE的函數:CALL SCAN

CALL SCAN(string, n, position, length, <delimiters>);

  • string: 通常是一個變項名稱, 例如上面的string
  • n: 數字, 該字串內使用者希望擷取出多少字詞(word), n為正數表示左到右掃, 負數表示從右到左掃, 若|n|大於string內的字詞數則回傳零
  • position: 回傳該字詞所在起始位置
  • length: 回傳該字詞的長度
  • <delimiters>: 選擇性的option, 可接受空白, < ( + & ! $ * ) ; ^ – / , % |等做為區隔符號

注意:使用CALL SCAN後要取得字詞,需要使用SUBSTRN函數

而SUTSTRN利用CALL SCAN得到的字詞起始位置與長度再做擷取動作,並非CALL SCAN完成整個目標喔!

這個範例應用到DO LOOP的概念來做重複掃字詞的動作

巧妙搭配output完成字詞輸出

data test;
      input string $60.;/*由於字串很長, 指定長度$60,$表示的意思應該..不陌生吧, 表示非數值*/
      drop string;
      do i=1 to 99;/*由於要讓他輸出每次掃到的字詞, 隨意訂個99~在此可以完整掃出*/
           call scan ( string,  i ,  position ,  length , ‘,’ );/*以逗點做區隔符號, 由左至右啟動*/
           if not position then leave;/*若沒有掃到位置,即跳出*/
          name=substrn ( string ,  position ,   length );/*將個別的字詞放到變項name裡*/
         output;/*在此馬上輸出字詞結果*/
   end;/*有do就有end, 請不要忘記*/
   datalines;
ASUS,CORSAIR,GIGABYTE,MSI,ACER,BlackBerry,intel,Shuttle
;

proc print data=test;/*在output視窗輸出結果*/
run;

輸出結果如下

CALL SCAN與SUBSTRN的搭配將逗號之間的字詞完整掃瞄出

其實變項i, position, length是可以不用輸出的,畢竟目標是name對吧!

Obs    i    position    length    Name
 1     1        1          4      ASUS
 2     2        6          7      CORSAIR
 3     3       14          8      GIGABYTE
 4     4       23          3      MSI
 5     5       27          4      ACER
 6     6       32         10      BlackBerry
 7     7       43          5      intel
 8     8       49         12      Shuttle

延伸函數:CALL SCANQ (最大的差別是此函數不考慮區隔符號)

參考來源:SAS help

離上篇文章隔了一段不短的日子

許多想法,仍需要時間慢慢向前給予助力


Comments



You must be logged in to post a comment.

Name (required)

Email (required)

個人網站

Speak your mind

total of 3715335 visits