SAS — Как разделить строку с переменной подстрокой на несколько столбцов

#variables #split #sas

#переменные #разделение #sas

Вопрос:

У меня есть набор данных, содержащий переменную X, состоящий из нескольких чисел, разделенных запятой. Количество элементов в строках различно. Я создал счетчик слов. Теперь я хотел бы видеть числа в разных столбцах.

Вот пример:

     X          Num_of_X       Var1    Var2    Var3    Var4   ... Varn
3,10,165         3             3       10     165
   1             1             1
  15,100         2            15      100
10,52,63,90      4            10       52      63      90
 

Я пробовал этот способ:

 %let max_num_X=max(num_of_x);

data have;
set have;
 length var1-varamp;max_num_X $10.;
 array Var(amp;max_num_X) $;
do i=1 to amp;max_num_X;
 Var[i]=scan(X,i,',');
 output;
 end;
run;
 

Не могли бы вы мне помочь?
Спасибо

Комментарии:

1. Вам нужно поместить фактическое максимальное значение NUM_OF_X из HAVE в переменную макроса. Все, что вы сделали, это поместили буквальный текст max …. в переменную макроса. Так что это приведет к генерации недопустимого кода SAS.

Ответ №1:

Сделайте что-то вроде этого

 data have;
input X :$20.;
datalines; 
3,10,165    
1           
15,100      
10,52,63,90 
;

data long;
   set have;
   n = _N_;
   do i = 1 to countw(X, ',');
      xx = scan(X, i, ',');
      output;
   end;
run;

proc transpose data = long out = want(drop=_:) prefix=Var;
   by n;
   id i;
   var xx;
run;
 

Комментарии:

1. Это действительно работает! Спасибо! Не могли бы вы лучше объяснить мне шаги?

Ответ №2:

вы можете использовать макрос, чтобы найти максимальное число и создать переменные:

 %macro create_vars();
    proc sql noprint; select max(countw(X)) into :max_num_X from have; quit;
    data have; set have;
       %do i = 1 %to amp;max_num_X.; Varamp;i. = scan(X,amp;i.,','); %end;
    run;
%mend;
%create_vars();