在SAS中使用压缩和输入功能

在SAS中使用压缩和输入功能,sas,Sas,我这里有两个数据集: data ONE; input ID LastName $ FirstInit $ 1.; datalines; 509182793 Smith C 319861601 Williams J 345121778 Connor F 480863211 King L

我这里有两个数据集:

data ONE;    
  input ID LastName $ FirstInit $ 1.;    
  datalines;                         
509182793 Smith C                   
319861601 Williams J                    
345121778 Connor F                  
480863211 King L                    
907636280 Franklin D                    
729082859 Monroe T                  
835688938 Hall K
  ;                 
run;    

data TWO; 
  input ID $ 11. State $ 2.;
  datalines;
334-99-5246 TX
480-86-3211 MD
449-55-9407 VA
345-12-1778 GA
907-63-6280 NY
790-09-9813 WY
319-86-1601 FL
  ;
run;
我有两个问题: 1) 您将如何使用
COMPRESS
创建新的字符变量“ncv”,并将ncv的值设置为字符变量ID的值,同时删除连字符?以下是我的尝试:

data TWO_NUMERIC;
  set TWO;
  ncv=COMPRESS(TWO, "+-", "d");
run;
2) 如何使用
PUT/INPUT
将ncv转换为数值,以创建数值变量“newncv”

从这两个问题开始,我先从数据步骤和SET语句开始:

data TWO_NUMERIC;
  set TWO;
run;

我查看了SAS 9.2的帮助页面,但在示例代码中使用这两条语句似乎让我感到困惑

好的,我本来想说RTM,但在这种情况下,它不清楚,至少在我看来不清楚

压缩的错误在于第一个参数应该是变量,在本例中是ID,而不是数据集2。此外,您只需要在列表中指定-而不是+,除非您认为变量中可能也有+。添加修饰符D,指定将数字添加到移除列表,这与您想要的相反

与PUT/INPUT的概念类似,引用变量并确保使用了正确的函数,在本例中,输入将其转换为数值

Data two_numeric;
   set two;

   ncv=COMPRESS(ID, "-");
   ncv_num=input(ncv, 12.);
run;

压缩可以用多种方式,一种是上面@Reeza描述的,另一种是使用“k”修饰符,意思是“保持”,如下所示

data TWO_NUMERIC;
  set TWO;
  ncv_d=COMPRESS(ID," ", "kd"); * kd means keep-digits, your code had TWO which is a dataset name;
  ncv_n=COMPRESS(ID," ", "kn"); * kd means keep-numbers;

  /* Input Function is used to convert CHAR to NUM        *
   * the best. format applies the nearest matching format */
  newncv=input(ncv_d,best.); 
run;  

我发现用于解释K修饰符的链接是

您的data和set语句缺少分号,分号需要在数据输入步骤的单独一行中。您说它们让您感到困惑,你能发布你在这些函数上的实际尝试吗?我已经附上了我认为最好的。是一种格式。如果您需要通用信息,请使用
12.
F12.
COMMA12.
。@Tom-Best。通常会让SAS选择最佳的符号。我也同意使用12。或者F12。甚至是16强。最好的一面:)如果使用
best.
作为格式,SAS将决定使用的最佳显示格式。但是,当你阅读数据时,这个决定是由生成你正在阅读的文本的人做出的。但是如果您在INFORMAT中指定
BEST.
,那么SAS将切换到使用
F.
格式。
F.
格式知道如何读取带小数点和不带小数点的数据以及科学符号。如果输入数据可能包含逗号或美元符号,则应使用
逗号。
INFORMAT。
data TWO_NUMERIC;
  set TWO;
  ncv_d=COMPRESS(ID," ", "kd"); * kd means keep-digits, your code had TWO which is a dataset name;
  ncv_n=COMPRESS(ID," ", "kn"); * kd means keep-numbers;

  /* Input Function is used to convert CHAR to NUM        *
   * the best. format applies the nearest matching format */
  newncv=input(ncv_d,best.); 
run;