现在我的问题是,当我收到“此范围重复或重叠”时,我遇到了一个更大的问题...具体来说,我的label值正在重复,我的意思是我的格式具有重复的值,例如a = aa b = aa c =某种。我该如何解决此错误。当我使用hlo = M作为muntilqbel选项时,它会提供两倍的数据...
我正在如下绘制地图。 Santhan = Santhan Chintu =桑坦
请提出解决方案。
答案 0 :(得分:0)
要将数据转换为FORMAT,请使用PROC FORMAT上的CNTLIN =选项。但是首先要确保数据描述了有效的格式。因此,请从文件中读取数据。
data myfmt ;
infile 'myfile.txt' dsd truncover ;
length fmtname $32 start $100 value $200 ;
fmtname = '$MYFMT';
input start value ;
run;
请确保将START和VALUE的长度设置为对于源文件可能具有的任何实际值而言足够长。
然后确保它已排序并且您没有重复的代码(START值)。
proc sort data=myfmt out=myfmt_clean nodupkey ;
by start;
run;
SAS日志将显示是否由于重复的START值而删除了任何观测值。
如果确实有重复值,则检查数据集或原始文本文件以了解原因并确定要如何处理重复项。上面的PROC SORT步骤将仅保留重复项之一。您可能只有精确的重复项,在这种情况下,只保留一个即可。或者,您可能希望将重复的观察折叠为一个观察,然后将多个解码连接为一个长解码。
如果需要,您可以添加一条记录,该记录将添加OTHER
中VALUE
语句的PROC FORMAT
关键字的功能。您可以使用它来设置默认值,例如“找不到值”,以解码您可能会遇到的原始源文件中没有的任何值。
data myfmt_final;
set myfmt_clean end=eof;
output;
if eof then do;
start = ' ';
label = 'Value not found';
hlo = 'O' ;
output;
end;
run;
然后使用PROC FORMAT从清理的数据文件制作格式。
proc format cntlin = myfmt_final;
run;
要将FORMAT转换为数据集,请使用PROC FORMAT上的CNTLOUT =选项。
例如,如果您之前已创建此格式。
proc format ;
value $myfmt 'ABC'='ABC' 'BCD'='BCD' 'BCD1'='BCD' 'BCD2'='BCD' ;
run;
然后,您可以使用另一个PROC FORMAT步骤来制作数据集。如果格式化目录已定义了多种格式,而您只想要其中一种(或几种),则使用SELECT语句。
proc format cntlout=myfmt ;
select $myfmt ;
run;
然后,您可以使用该数据集轻松创建文本文件。例如,逗号分隔的文件。
data _null_;
set myfmt ;
file 'myfmt.txt' dsd ;
put start label;
run;
结果将是一个文本文件,如下所示:
ABC,ABC
BCD,BCD
BCD1,BCD
BCD2,BCD
答案 1 :(得分:0)
出现此错误是因为您具有映射到两个不同类别的相同代码。我猜您可能没有从文本文件正确导入数据,并最终使某些值被截断了,但是如果没有完整的过程,这是有根据的猜测。
这可以正常工作:
proc format;
value $ test
'a'='aa' 'b'='aa' 'c'='as'
;
run;
此版本将不起作用,因为a
映射到两个不同的值,因此SAS将不知道要使用哪个值。
proc format;
value $ badtest
'a'='aa'
'a' = 'ba'
'b' = 'aa'
'c' = 'as';
run;
这将产生有关数据重叠的错误。
解决此问题的方法是找到重复项,并确定它们应实际映射到的代码。 PROC SORT可用于获取重复记录。