此范围重复或重叠

时间:2018-12-24 16:59:02

标签: sas

现在我的问题是,当我收到“此范围重复或重叠”时,我遇到了一个更大的问题...具体来说,我的label值正在重复,我的意思是我的格式具有重复的值,例如a = aa b = aa c =某种。我该如何解决此错误。当我使用hlo = M作为muntilqbel选项时,它会提供两倍的数据...

我正在如下绘制地图。  Santhan = Santhan Chintu =桑坦

请提出解决方案。

2 个答案:

答案 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步骤将仅保留重复项之一。您可能只有精确的重复项,在这种情况下,只保留一个即可。或者,您可能希望将重复的观察折叠为一个观察,然后将多个解码连接为一个长解码。

如果需要,您可以添加一条记录,该记录将添加OTHERVALUE语句的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可用于获取重复记录。