将字符串拆分为内容为

时间:2016-03-07 03:07:02

标签: sas

我的数据如下:

ID    Sequence
---------------------------------
101   E6S,K11T,Q174K,D177E
102   K11T,V245EKQ

我需要添加:

  1. 为每个序列添加列标题的新列,添加前缀“RT”,删除序列数字部分后面的字母
  2. 使用数字部分后面的字母填充新列 序列
  3. 我需要创建这个:

    ID    Sequence                RTE6   RTK11   RTQ174   RTD177   RTV245
    -----------------------------------------------------------------------
    101   E6S,K11T,Q174K,D177E    S      T       K        E
    102   K11T,V245EKQ                   T                         EKQ
    

2 个答案:

答案 0 :(得分:0)

前一段时间我遇到过类似的问题。代码适合您的问题。

如果发现这个解决方案比我尝试使用proc转置的任何东西都要快。 大型数据集的总体性能(特别是使用许多不同的序列)并不是很好,因为我们在所有字符串和最终变量上循环2 * 2。

任何人都可以提供更快的解决方案吗?

(注意:MacroVar限制为65534个字符。)

data var_name ;
    set in_data;
    length var string $30.;
    do i = 1 to countw(Sequence, ',');
        string = scan(Sequence,i,',');
        var = substr(string,1,anydigit(string,-99));
        output;
        keep var;
    end;
run;
proc sql noprint; 
    select distinct compress("RT"||var) into :var_list separated by ' '
        from var_name;
quit;
%put &var_list.;
data out_data;
    set in_data;
    length string &var_list.  $30. n 8. ;
    array a_var [*] &var_list.;
    do i = 1 to countw(Sequence, ',');
        string = scan(Sequence,i,',');
        do j = 1 to dim(a_var);
            n = anydigit(string,-99) ;
            if substr(vname(a_var[j]),3) eq substr(string,1,n) then a_var[j] = substr(string,n+1);
        end;
    end;
    drop string i j n;
run;

答案 1 :(得分:0)

我假设您需要SAS数据集而不是报告。 ANYDIGIT可以很容易地找到最后一个非数字子字符串。

data seq;
   infile cards firstobs=3;
   input id:$3. sequence :$50.;
   cards;
ID    Sequence
---------------------------------
101   E6S,K11T,Q174K,D177E
102   K11T,V245EKQ
;;;;
   run;
proc print;
   run;
data seq2V / View=seq2V;
   set seq;
   length w name sub $32 subl 8;
   do i = 1 by 1;
      w = scan(sequence,i,',');
      if missing(w) then leave;
      subl = anydigit(w,-99);
      name = substrn(w,1,subl);
      sub = substrn(w,subl+1);
      output;
      end;
   run;
proc transpose data=seq2V out=seq3(drop=_name_) prefix=RT;
   by id sequence;
   var sub;
   id name;
   run;
proc print;
   run;

enter image description here