0

我有这样的数据

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

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

4

1 回答 1

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 大写(默认情况下,大写在小写之前排序)。

于 2013-05-24T13:59:44.137 回答