SAS: При использовании пользовательских форматов, если нет совпадения, «значение по умолчанию» является неформатированной входной переменной? - PullRequest
0 голосов
/ 24 июня 2019

В SAS EG у меня есть пользовательский формат

value $MDC
'001' = '77'
'002' = '77 
...
'762' = '14' 
etc.

В моем наборе данных есть строковые переменные DRG_code со значениями, такими как '001' и '140'.

Я пыталсясоздайте новую переменную с кодом ниже.

MDC = put(DRG_code, $MDC.)

Только в моем наборе данных есть больше значений переменной DRG_code, чем указано в файле формата, заданном пользователем, $MDC.

Например, когда набор данных DRG_Code равен'140' это значение не существует в определяемом пользователем формате, и по какой-то причине оператор put возвращает MDC = '14' (его значением должно быть только значение с кодом DRUG '762').

Есть ли способ убедиться, что мой оператор put возвращает значение только из определенного пользователем формата, когда присутствует соответствующее значение?

Благодарен за отзыв.

Лори

Я попытался использовать форматирование типа «length», чтобы мой оператор put возвращал 3, что, как я думал, приведет к «140» вместо «14», и это не сработало.

value $MDC
'001' = '77'
'002' = '77 
...
'762' = '14' 

MDC = put(DRG_code, $MDC.)

Ответы [ 4 ]

2 голосов
/ 24 июня 2019

Форматы имеют ширину ПО УМОЛЧАНИЮ. Если вы не указали ширину при использовании формата, тогда SAS будет использовать ширину по умолчанию. При создании пользовательского формата PROC FORMAT устанавливает ширину по умолчанию равной максимальной ширине отформатированных значений. В вашем примере ширина по умолчанию установлена ​​на 2.

Вы можете изменить это, когда используете формат.

MDC = put(DRG_code, $MDC3.)

Или вы можете определить значение по умолчанию при определении формата.

value $MDC (default=3)
  '001' = '77'
  '002' = '77'
  ...
  '762' = '14' 
;

Вы также можете установить значение по умолчанию для несопоставленных значений, используя ключевое слово other.

value $MDC (default=3)
  '001' = '77'
  '002' = '77'
  ...
  '762' = '14' 
  other = 'UNK'
;

Вы можете даже вкладывать вызов в другой формат для несопоставленных значений (или любого целевого формата). В этом случае вам не нужно указывать ширину по умолчанию, так как ширина во вложенном формате будет использоваться при определении ширины по умолчанию.

value $MDC 
  '001' = '77'
  '002' = '77'
  ...
  '762' = '14' 
  other = [$3.]
;
0 голосов
/ 24 июня 2019

Вы также можете исправить это, указав длину, используемую при применении формата, например,

proc format;
  value $MDC
  '001' = '77'
  '762' = '14'
  ;
run;

data _null_;
  do var = '001','140','762';
    var_formatted = quote(put(var,$MDC3.));
    put var= var_formatted=;
  end;
run;

Выход:

var=001 var_formatted="77 "
var=140 var_formatted="140"
var=762 var_formatted="14 "

N.B. как это решение, так и решение Ричарда приведет к добавлению конечных пробелов к форматированным значениям, как видно из кавычек.

0 голосов
/ 24 июня 2019

Здесь я предлагаю небольшую модификацию решения user667489, чтобы:

  • вам не нужно указывать длину формата каждый раз, когда вы его используете (используя опцию default оператора value при определении формата)
  • результирующее отформатированное значение не имеет конечных пробелов (с помощью функции trim() на выходе, полученном в результате применения формата)

1012 * т.е. *

proc format;
    value $MDC(default=3)
        '001' = '77'
        '002' = '77'
        '762' = '14'
    ;
run;

data _null_;
    do var = '001', '140', '762';
        var_formatted = quote(trim(put(var, $MDC.)));
        put var= var_formatted=;
    end;
run;

, который дает следующий вывод:

var=001 var_formatted="77"
var=140 var_formatted="140"
var=762 var_formatted="14"
0 голосов
/ 24 июня 2019

Я предполагаю, что все сопоставления значений были $ 2, потому что это то, что используется для «необнаруженного» исходного значения. Чтобы обеспечить длину «не найденных» значений, убедитесь, что один отформатированных значений имеет завершающие пробелы, заполняющие до длины самого длинного не найденного значения.

value $MDC
'001' = '77     ' /* 7 characters, presuming no DRG_code exceeds 7 characters */
'002' = '77'
'762  = '14'
...