2015-09-24 12 views
0

Я создал форматы, такие как следующиеИспользования созданных форматов из SAS наборов данных

data formatset; 
    input fmtname $ start $ end $ label $; 
    datalines; 
$test region1 region3 zone1 
$test region4 region5 zone2 
$test region6 region7 zone3 
; 
run; 

proc format library = work.formats 
    cntlin = work.formatset; 
run; 
quit; 

Проблему: Я буду иметь новые данные с линиями передачи данных переменной region. И я хочу, чтобы новый атрибут zone который используют формат $test.

data output; 
    input region $; 
    format zone $test.; 
    zone = region; 
    datalines; 
region1 
region2 
region3 
region4 
region5 
region6 
region7 
region8 
; 
run; 

enter image description here

ответ

2

Вы должны указать ширину при использовании формата, чтобы убедиться, что достаточное количество символов для чтения из вашей zone переменной , Попробуйте format zone $test7.; на втором шаге.

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

1

Что идет не так, когда вы используете формат

format zone $test.; С, вы создали переменную zone с внутренней длиной $5 (пять знаков). Для доказательства того, что, запустить

proc contents data=output; 
run; 

С zone = region; присвоить значение вашей region к zone, который затем усекается до 5 символов. Метка применяется только при печати или перепечатке данных. В этот момент переменная zone содержит текст «regio», который не находится в одном из диапазонов start до end и, следовательно, не переведен.

Как вы можете вылечить это, когда, используя формат

Один из способов вылечить это применить формат уже когда присвоить значение zone, написание zone = put(region, $test);.

Еще один вариант заключается в том, чтобы явно указать длину хранилища зоны с length zone $7; перед тем, как дать ему формат, или сделать оба сразу с format zone $test.;, как и на другой ответ.

Почему этот формат ведет себя таким образом

Когда вы создаете символьный формат, используя cntlin, в proc format, он получает как длина максимальная длина этикетки, в вашем случае 5 символов. Эта длина - это количество символов, с которыми сохраняется переменная с этим форматом. Вы можете видеть, что если вы запустите

proc format library = work.formats 
    cntlin = work.formatset; 
run; 

Это не логично, на самом деле, и что еще хуже, вы не можете изменить это, указав длину в вашем cntlin наборе данных.

Как вылечить его в самом формате

Просто указать любое значение, для которого формат должен показывать что-то из 8 байтов:

data formatset; 
    input fmtname $ start $ end $ label $; 
    datalines; 
$test region1 region3 zone1 
$test region4 region5 zone2 
$test region6 region7 zone3 
$test _dummy_ _dummy_ 1234567 
; 
run; 
1

Проблема заключается в том, что вы не определили переменную ZONE перед назначением ему формата. Таким образом, SAS использовала длину по умолчанию для назначенного формата для определения переменной зоны. Вы можете исправить это, перемещая инструкцию FORMAT после инструкции присваивания. Тогда SAS предположил бы, что ZONE должна иметь ту же длину, что и REGION.

Но реальное решение заключается в определении ваших переменных перед их использованием или прикреплении к ним форматов.

data output; 
    length region $8 zone $8 ; 
    input region; 
    zone = region; 
    format zone $test.; 
cards ; 
... 

Если вы хотите, чтобы значение ZONE было значением $ TEST. формат будет отображаться, а затем использовать функцию PUT() в операторе присваивания вместо привязки формата к переменной.

zone = put(region,$test.);