防止cntlin截断变量值
我正在使用下面的代码来设置我关注变量的格式:
data thenameofmyvar;
length label $200.;
set mydb(keep= thenameofmyvar);
retain fmtname '$myfmt' type '$';
start = put(_N_, 8.);
label = thenameofmyvar;
run;
proc format cntlin=thenameofmyvar;run;
data mydb;format thenameofmyvar $myfmt.;set mydb; run;
这段代码可以完成工作,但它会截断变量("thenameofmyvar")的值,尽管标签设为 $200。最终长度只有1。
请问有人能帮我吗?
解决方案
'$' 不是TYPE变量的有效值。 使用 'N' 表示数值格式,'C' 表示字符格式。但其实TYPE变量并不需要,因为当格式名称以 '$' 开头时,PROC FORMAT会创建一个字符格式。
使用TYPE的无效值会使PROC FORMAT将每条观测视为一次新的请求来创建格式。因此结果中只有最后一个观测真正进入了格式。
如果你想控制格式的长度,请在CNTLIN数据集中包含MIN、MAX和 DEFAULT变量。
由于你没有包含DEFAULT变量来设定格式的默认显示宽度,PROC FORMAT将使用LABEL变量值长度的最大值。因此很可能 thenameofmyvar 的最后一个值只有一个字节。
但你为什么要把像 ' 1' 和 ' 2' 这样的字符串映射到变量的值上?
你是想创建一个仅由数据中出现的值组成的格式,并让这些值映射到它们自身吗?
如果是这样,就将START和 LABEL值设为相同的值。
所以也许你想做类似这样的事情。
data cntlin;
set sashelp.class(keep=sex rename=(sex=START));
retain fmtname "$sex" ;
label=start ;
run;
proc sort nodupkey;
by fmtname start;
run;
proc format cntlin=cntlin fmtlib;
run;
结果
----------------------------------------------------------------------------
| FORMAT NAME: $SEX LENGTH: 1 NUMBER OF VALUES: 2 |
| MIN LENGTH: 1 MAX LENGTH: 40 DEFAULT LENGTH: 1 FUZZ: 0 |
|--------------------------------------------------------------------------|
|START |END |LABEL (VER. V7|V8 16APR2026:15:47:21)|
|----------------+----------------+----------------------------------------|
|F |F |F |
|M |M |M |
----------------------------------------------------------------------------
请修改示例代码,使用NAME变量代替SEX变量,以看到一个包含更多且更长值的示例。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。