从观察中提取单词并将其与数据表中的其他单词进行匹配

时间:2013-05-23 07:00:04

标签: sas

我有这样的数据

Code Sx1 Sx2 Sx3 SX4
P1  XX  AA  ZZ  HH
P2  AA  XX  AA  BB
RR1 XA  XX  ZA  HB
RR2 AA  XA  ZA  BH
RR3 AX  AX  ZZ  HH
RR4 AA  AA  AA  BB
RR5 XX  XX  ZA  HB
RR6 AX  XA  ZZ  HH
RR7 AA  AX  AA  BB
RR8 XX  AA  AZ  HH

我想从P1(X)中提取一个字母,从P2(A)中提取另一个字母然后我想使用那些提取的字母(AX或XA)来匹配从RR1到RR8的观察,如果它们匹配那么1 ,然后将不是0.我想使用数组,因为我的数据包含超过8,000个观察。 我想要这样

SX1 SX2 SX3 SX4
1   0   1   1
0   1   1   1
1   1   0   0
0   0   0   0
0   0   1   1
1   1   0   0
0   1   0   0
0   0   1   0

我试图通过使用Substr函数来解决这个问题

Data x; 
Set y; 
var1 = SUBSTR (SX1,1,1); 
var2= SUBSTR (SX2,1,1); 
var3= SUBSTR (SX3,1,1); 
var4= SUBSTR (SX4,1,1);
PACKAGE_SUBSTR = LETTER_1|| LETTER_2|| LETTER_3;
RUN;

我将使用数组来存储我的变量来自SX1-SX4然后

此后我想将此连接变量与数组中的其他观察值相匹配以达到我的目标。我想知道我是否以正确的方式进行?帮助解决这个问题。

1 个答案:

答案 0 :(得分:0)

我将使用的解决方案是转置您的数据集,使得每个变量只有一行(而不是44个变量)。然后将它们合并在一起这样它非常灵活,可以容纳任意数量的变量。像这样:

data have;
input Code $ Sx1  $ Sx2 $ Sx3 $ SX4 $;
datalines;
P1  XX  AA  ZZ  HH
P2  AA  XX  AA  BB
RR1 XA  XX  ZA  HB
RR2 AA  XA  ZA  BH
RR3 AX  AX  ZZ  HH
RR4 AA  AA  AA  BB
RR5 XX  XX  ZA  HB
RR6 AX  XA  ZZ  HH
RR7 AA  AX  AA  BB
RR8 XX  AA  AZ  HH
;;;;
run;

data p1(drop=code rename=value=value1) p2(drop=code rename=value=value2) code;
set have;
array vars sx1-sx4;
do _t = 1 to dim(vars);
  varname = vname(vars[_t]);
  value = vars[_t];
  if code='P1' then output p1;
  else if code='P2' then output p2;
  else output code;
end;
keep code varname value;
run;

proc sort data=p1;
by varname;
run;
proc sort data=p2;
by varname;
run;
data type1 type2;
merge p1 p2;
by varname;
value = cat(substr(value1,1,1),substr(value2,2,1));
output type1;
value = cat(substr(value2,2,1),substr(value1,1,1));
output type2;
keep varname value;
run;

proc sort data=code;
by varname value;
run;
proc sort data=type1;
by varname value;
run;
proc sort data=type2;
by varname value;
run;
data code_match;
merge code(in=c) type1(in=t) type2(in=t);
by varname value;
if c;
if c and t then match=1;
else match=0;
run;

proc sort data=code_match;
by code varname;
run;
proc transpose data=code_match out=want;
by code;
id varname;
var match;
run;

您可能需要根据需要稍微调整规则,我不确定我是否正确实现了这些规则,但是对于此示例,它确实可以获得所需的数据集。在这种情况下,变量可能没有正确的顺序,因为你有大写的SX4(默认情况下大写字母排在小写之前)。