我想在SAS中合并两个数据集,但它们没有共同的变量。一个数据集具有“subject_id”变量,而另一个具有“mom_subject_id”变量。这两个变量都是9位代码,在代码中间只有3位数,具有共同的含义,这就是我合并它们时需要匹配的两个数据集。
我想要做的是在每个数据集中创建一个新的公共变量,它只是主题ID中的3位数。这3个数字将始终位于9位主题ID中的相同位置,因此我想知道是否有办法从变量中提取这3个数字以创建新变量。
谢谢!
答案 0 :(得分:7)
SQL(使用Data Step代码中的示例数据):
proc sql;
create table want2 as
select a.subject_id, a.other, b.mom_subject_id, b.misc
from have1 a JOIN have2 b
on(substr(a.subject_id,4,3)=substr(b.mom_subject_id,4,3));
quit;
数据步骤:
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;
答案 1 :(得分:0)
另一种方法是使用
proc sql
然后使用 join 和 substr(),如上所述,如果你对sql感到满意
答案 2 :(得分:0)
假设你的" subject_id"变量是一个数字,然后substr
函数不会工作,因为sas会尝试将数字转换为字符串。但默认情况下,它会在数字的左侧填充一些步伐。
您可以使用模数函数mod(input, 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排序新数据集,然后合并。