使用从 SAS 数据集中创建的格式
Usage of Created Formats from SAS Data Sets
我创建了如下格式
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;
您需要在使用格式时指定宽度,以确保从 zone
变量中读取足够的字符。在第二个数据步骤中尝试 format zone $test7.;
。
如果不指定宽度,SAS 默认为为格式定义的任何显示值的最大长度。然后,在查找要显示的格式化值时,它只会从格式化变量中读取那么多字符(在你的例子中是 5 个字符),如果在格式中没有为这 5 个字符指定值,那么它们将逐字显示。
使用格式时出了什么问题
使用 format zone $test.;
,您创建了一个内部长度为 </code>(五个字符)的变量 <code>zone
。为了证明这一点,运行
proc contents data=output;
run;
使用 zone = region;
时,您将 region
的值分配给 zone
,然后 运行 将其分配给 5 个字符。标签仅在您打印或列出数据时应用。在那个时间点,变量 zone
包含文本 "regio",它不在 start
到 end
范围之一,因此没有被翻译。
使用格式时如何解决这个问题
解决它的一种方法是在为 zone
赋值时应用格式,写作 zone = put(region, $test);
。
另一种方法是在给它一个格式之前用 length zone ;
明确指定区域的存储长度,或者像其他答案建议的那样用 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;
问题是您在为变量 ZONE 分配格式之前没有定义它。所以 SAS 使用分配格式的默认长度来定义变量区域。您可以通过将 FORMAT 语句移动到赋值语句之后来解决此问题。然后 SAS 会假定 ZONE 的长度应与 REGION 的长度相同。
但真正的解决方案是在使用变量或向其附加格式之前定义变量。
data output;
length region zone ;
input region;
zone = region;
format zone $test.;
cards ;
...
如果您希望 ZONE 的值是 $TEST.格式将显示,然后在赋值语句中使用 PUT() 函数,而不是将格式附加到变量。
zone = put(region,$test.);
我创建了如下格式
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;
您需要在使用格式时指定宽度,以确保从 zone
变量中读取足够的字符。在第二个数据步骤中尝试 format zone $test7.;
。
如果不指定宽度,SAS 默认为为格式定义的任何显示值的最大长度。然后,在查找要显示的格式化值时,它只会从格式化变量中读取那么多字符(在你的例子中是 5 个字符),如果在格式中没有为这 5 个字符指定值,那么它们将逐字显示。
使用格式时出了什么问题
使用 format zone $test.;
,您创建了一个内部长度为 </code>(五个字符)的变量 <code>zone
。为了证明这一点,运行
proc contents data=output;
run;
使用 zone = region;
时,您将 region
的值分配给 zone
,然后 运行 将其分配给 5 个字符。标签仅在您打印或列出数据时应用。在那个时间点,变量 zone
包含文本 "regio",它不在 start
到 end
范围之一,因此没有被翻译。
使用格式时如何解决这个问题
解决它的一种方法是在为 zone
赋值时应用格式,写作 zone = put(region, $test);
。
另一种方法是在给它一个格式之前用 length zone ;
明确指定区域的存储长度,或者像其他答案建议的那样用 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;
问题是您在为变量 ZONE 分配格式之前没有定义它。所以 SAS 使用分配格式的默认长度来定义变量区域。您可以通过将 FORMAT 语句移动到赋值语句之后来解决此问题。然后 SAS 会假定 ZONE 的长度应与 REGION 的长度相同。
但真正的解决方案是在使用变量或向其附加格式之前定义变量。
data output;
length region zone ;
input region;
zone = region;
format zone $test.;
cards ;
...
如果您希望 ZONE 的值是 $TEST.格式将显示,然后在赋值语句中使用 PUT() 函数,而不是将格式附加到变量。
zone = put(region,$test.);