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

Sas 从观察值中提取单词并与数据表中的其他单词进行匹配,sas,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 SX1 SX2 SX3 SX4 1 0 1 1

我有这样的数据

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
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
我想从P1(X)中提取一个字母,从P2(A)中提取另一个字母,然后我想使用这些提取的字母(AX或XA)来匹配从RR1到RR8的观察值,如果它们匹配,那么1,而不是0。我想使用数组,因为我的数据包含8000多个观察值。 我想要这样

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
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的变量,然后


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

我将使用的解决方案是转置数据集,以便每个变量有一行,而不是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大写(默认情况下,大写字母排序在小写字母之前)。

您有8000个观察值和4个SX1-SX4变量,或者您有超过这4个变量吗?非常感谢Joe帮助我,实际上我这里有44个变量,我只见过4个,我只想从P1和P2两个变量中提取一个字母,例如SX1,如果我得到像XA这样的提取字母,然后我想将它们与SX1变量的剩余观察值相匹配。如果对var SX1的观察结果一致,则为1,否则为0。非常感谢您的帮助,非常感谢您的帮助,您的代码运行良好,我根据自己的要求进行了更改。