Sas 此范围重复或重叠

Sas 此范围重复或重叠,sas,Sas,现在我的问题是我有一个更大的问题,因为我得到“这个范围是重复的或重叠的”。。。具体地说,我的标签值是重复的,我的意思是我的格式有重复的值,比如a=aab=aac=as。如何解决此错误。当我使用hlo=M as muntilqbel选项时,它提供了两倍的数据 我正在映射如下。 三韩 钦图=三滩 请提出解决办法 要将数据转换为某种格式,请使用PROC FORMAT上的CNTLIN=选项。但首先要确保数据描述的格式有效。所以从文件中读取数据 data myfmt ; infile 'myfile.

现在我的问题是我有一个更大的问题,因为我得到“这个范围是重复的或重叠的”。。。具体地说,我的标签值是重复的,我的意思是我的格式有重复的值,比如a=aab=aac=as。如何解决此错误。当我使用hlo=M as muntilqbel选项时,它提供了两倍的数据

我正在映射如下。 三韩 钦图=三滩


请提出解决办法

要将数据转换为某种格式,请使用PROC FORMAT上的CNTLIN=选项。但首先要确保数据描述的格式有效。所以从文件中读取数据

data myfmt ;
  infile 'myfile.txt' dsd truncover ;
  length fmtname $32 start $100 value $200 ;
  fmtname = '$MYFMT';
  input start value ;
run;
确保将“开始”和“值”的长度设置为足以容纳源文件可能具有的任何实际值

然后确保它已排序,并且没有重复的代码(起始值)

SAS日志将显示是否由于重复的开始值而删除了任何观察结果

proc sort data=myfmt out=myfmt_clean nodupkey ;
  by start;
run;
如果确实存在重复值,请检查数据集或原始文本文件,以了解原因并确定如何处理重复值。上面的PROC SORT步骤将只保留一个副本。您可能只有完全相同的副本,在这种情况下,只保留一个就可以了。或者,您可能希望将重复的观察折叠为单个观察,并将多个解码连接为一个长解码

如果需要,您可以添加一条记录,该记录将添加
PROC FORMAT
VALUE
语句的
OTHER
关键字的功能。您可以使用它来设置一个默认值,如“找不到值”,以解码您可能遇到的任何不在原始源文件中的值

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;
要将格式转换为数据集,请使用PROC FORMAT上的CNTLOUT=选项

例如,如果您以前创建过此格式

proc format ;
  value $myfmt 'ABC'='ABC' 'BCD'='BCD' 'BCD1'='BCD' 'BCD2'='BCD' ;
run;
然后,您可以使用另一个PROC格式步骤来创建数据集。如果格式化目录定义了多个格式,并且只需要其中一个(或部分),请使用SELECT语句

然后,您可以使用该数据集轻松创建文本文件。例如,逗号分隔的文件

data _null_;
  set myfmt ;
  file 'myfmt.txt' dsd ;
  put start label;
run;
结果将是一个如下所示的文本文件:

ABC,ABC
BCD,BCD
BCD1,BCD
BCD2,BCD

出现此错误是因为您有相同的代码映射到两个不同的类别。我猜您可能没有正确地从文本文件导入数据,并最终截短了一些值,但没有完整的过程,这是一个有根据的猜测

这很好:

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可用于获取重复记录

为你正在做的事情提供更多的背景知识。如果您正在引用另一个问题,请添加链接。为什么要创建一种格式?您打算如何使用该格式?一种格式是你所需要的吗?你的例子没有对同一个代码进行多次解码。多标签设计用于处理同一代码的多个解码。映射到同一解码的多个代码可以用普通格式处理。是的,我需要格式。我的意图是取出proc格式值的硬值,并将其作为文本文件中的一个条目。我正在从文件中读取数据并将其加载到数据集。现在我正在对它们进行格式化或映射,以便进一步处理。我的例子如下。ABC=ABC BCD=BCD BCD1=BCD BCD2=BCD BCD3=BCD,依此类推。现在我正在通过将infle的数据加载到dataset来动态格式化…如果您有格式开始,那么使用CNTLOUT=option来创建一个dataset。这样就很容易制作一个文本文件。否则,如果您实际上没有将格式用作格式,为什么还要添加格式的复杂性?我使用的是cntlin=dataset选项。我已经成功了4种格式。我的最后一种格式是text=text格式,正如我上面所说的那样,这是一个错误。。。我的示例数据如下所示。ABC=ABC BCD=BCD BCD1=BCD BCD2=BCD BCD3=BCD。。。。。。。。。。。现在请告诉我如何解决这个问题。以advanceproc格式表示感谢;值$myfmt'ABC'='ABC''BCD'='BCD''BCD1'='BCD''BCD2'='BCD';跑这是一条艰难的道路。我从一个带分隔符的文本文件中传递值ABC=ABC等。现在我想把它们映射到我出错的地方。我有3000个值,这不能以一种很难的方式从文本文件加载数据。我想要与你的答案完全相反的方式,更新答案中的代码有额外的步骤来确保数据集可以用于生成格式。确保您知道文本文件中的内容,并且它实际上是可用于制作格式的内容。
proc format;
value $ badtest
'a'='aa'
'a' = 'ba'
'b' = 'aa' 
'c' = 'as';
run;