SAS изменяет все числа на длину 8, даже если наборы входных данных определяют числа, иначе - PullRequest
0 голосов
/ 08 мая 2020

У меня есть два набора входных данных, которые мне нужно переплести. Входные файлы имеют определенную длину для числовых c полей в зависимости от размера целого числа. Когда я переплетаю наборы данных - либо оператор DATA, либо PRO C SQL - длины полей numeri c сбрасываются на значение по умолчанию 8. За исключением явного определения длины для каждого поля в LENGTH утверждение, есть ли возможность для SAS сохранить исходные атрибуты входных столбцов?

Подробнее ...

данные A;

длина numeric_variable 3;

{входные данные};

данные B;

длина numeric_variable 3;

{входные данные};

данные AB;

установить AB; by some_id_variable;

{stuff};

;

В наборе данных AB переменная NUMERIC_VARIABLE имеет длину 8 вместо 3. Я могу явно поместить другой оператор длины в утверждение "данные AB", но у меня тонны столбцов.

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Можете ли вы опубликовать код, демонстрирующий проблему?

Этот код НЕ показывает окончательный набор данных, в котором длина numeri c изменяется с 3 на 8.

data A;   id = 'A';   length x 3;   x=1;
data B;   id = 'A';   length x 3;   x=2;
data AB;
  set A B;
  by id;
run;
proc contents data=AB; run;

Содержание

#    Variable    Type    Len

1    id          Char      1
2    x           Num       3

0 голосов
/ 08 мая 2020

Ваше описание неверно. Шаг данных устанавливает длину в зависимости от того, как она была определена вначале. Если вы просто выберете переменную в SQL, она сохранит свою длину. Однако в SQL, если вы делаете что-то вроде UNION, который объединяет переменные из разных источников, тогда длина будет равна 8.

Пример:

data one; length x 3; x=1; run;
data two; length x 5; x=2; run;
data one_two; set one two; run;
data two_one; set two one; run;
proc sql ;
  create table sql_one as select * from one;
  create table sql_two as select * from two;
  create table sql_one_two as select * from one union select * from two;
  create table sql_two_one as select * from two union select * from one;
quit;

proc sql;
 select memname,name,length 
 from dictionary.columns
 where libname='WORK'
   and memname like '%ONE%'
   or  memname like '%TWO%'
 ;
quit;

Результаты:

                                                                      Column
Member Name                       Column Name                         Length
----------------------------------------------------------------------------
ONE                               x                                        3
ONE_TWO                           x                                        3
SQL_ONE                           x                                        3
SQL_ONE_TWO                       x                                        8
SQL_TWO                           x                                        5
SQL_TWO_ONE                       x                                        8
TWO                               x                                        5
TWO_ONE                           x                                        5

Итак, если вы хотите определить свои переменные, либо добавьте оператор длины, как вы упомянули, либо создайте наборы данных шаблона и сделайте ссылку на него в своих шагах данных, прежде чем ссылаться на другие наборы данных. Для сложного кода SQL вам нужно будет включить параметр LENGTH = в предложение SELECT, чтобы задать длины для создаваемых вами переменных.

...