我有这样的数据
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然后
此后我想将此连接变量与数组中的其他观察值相匹配以达到我的目标。我想知道我是否以正确的方式进行?帮助解决这个问题。
答案 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(默认情况下大写字母排在小写之前)。