如何通过提取现有数值变量的部分值在SAS中创建新变量?

如何通过提取现有数值变量的部分值在SAS中创建新变量?,sas,Sas,我想合并SAS中的两个数据集,但它们没有公共变量。一个数据集有一个“subject\u id”变量,而另一个数据集有一个“mom\u subject\u id”变量。这两个变量是9位数字代码,在代码中间只有3位数字,这是共同的含义,这就是我需要在合并时对两个数据集进行匹配的方法。p> 我想做的是在每个数据集中创建一个新的公共变量,它只是主题ID中的3位数字。这3位数字将始终位于9位主题ID中的同一位置,因此我想知道是否有方法从变量中提取这3位数字以生成新变量 谢谢 SQL(使用数据步骤代码中的示

我想合并SAS中的两个数据集,但它们没有公共变量。一个数据集有一个“subject\u id”变量,而另一个数据集有一个“mom\u subject\u id”变量。这两个变量是9位数字代码,在代码中间只有3位数字,这是共同的含义,这就是我需要在合并时对两个数据集进行匹配的方法。p> 我想做的是在每个数据集中创建一个新的公共变量,它只是主题ID中的3位数字。这3位数字将始终位于9位主题ID中的同一位置,因此我想知道是否有方法从变量中提取这3位数字以生成新变量

谢谢

SQL(使用数据步骤代码中的示例数据):

数据步骤:

 data have1;
  length subject_id $9;
  input subject_id $ other $;
  datalines;
   abc001def other1
   abc002def other2
   abc003def other3
   abc004def other4
   abc005def other5
  ;

 data have2;
  length mom_subject_id $9;
  input mom_subject_id $ misc $;
  datalines;
   ghi001jkl misc1
   ghi003jkl misc3
   ghi005jkl misc5
  ;

 data have1;
  length id $3;
  set have1;
  id=substr(subject_id,4,3);
 run;

 data have2;
  length id $3;
  set have2;
  id=substr(mom_subject_id,4,3);
 run;

 Proc sort data=have1;
  by id;
 run;

 Proc sort data=have2;
  by id;
 run;

 data work.want;
  merge have1(in=a) have2(in=b);
  by id;
 run;

另一种选择是使用

    proc sql
然后使用join和substr(),如上所述,如果您对sql感到满意,那么假设“subject_id”变量是一个数字,
substr
函数将无法工作,因为sas将尝试将数字转换为字符串。但默认情况下,它会在数字的左侧填充一些空格

您可以使用模数函数
mod(input,base)
,当输入除以base时,该函数返回余数

/*First get rid of the last 3 digits*/
temp_var = floor( subject_id / 1000);
/* then get the next three digits that we want*/
id = mod(temp_var ,1000);
或者在一行中:

id = mod(floor(subject_id / 1000), 1000);
然后可以继续按id对新数据集进行排序,然后合并

id = mod(floor(subject_id / 1000), 1000);