SAS - 比较变量内容和标记变体

时间:2016-05-31 20:56:04

标签: performance sas duplicates compare

我收到了一个扁平文件,该文件在其他变量中保留有关重复ID记录的信息,而不是其他记录。

例如,下面的数据集:

ResID   VarA   VarB
XAB2    Red    13
XAB2    Ylw    13
BGH3    Grn    14
FHT1    Prp    13
XAB2    Blu    13

转入此:

ResID   VarA_1   VarA_2   VarA_3   VarB_1   VarB_2   VarB_3
XAB2    Red      Ylw      Blu      13       13       13
BGH3    Grn                        14
FHT1    Prp                        13

如您所见,与ID“XAB2”相关联的所有变量都被平展为一条记录,因此可以保留所有信息,但数据集仍可以作为人员级别文件处理。

这很酷。但现在我需要调和重复之间的差异。

我目前计划在数据步骤中编写一系列非常无聊的if / else if语句,例如:

     if VarA_2 NE " " and VarA_2 EQ VarA_1 then FLAG_VarA_dup = 0;
else if VarA_2 NE " " and VarA_2 NE VarA_1 then FLAG_VarA_dup = 1;
else if VarA_3 NE " " and VarA_3 EQ VarA_2 then FLAG_VarA_dup = 0;
else if VarA_3 NE " " and VarA_3 NE VarA_2 then FLAG_VarA_dup = 1;

/*...etc. for all VarB occurrences, and all other variables in my very wide DS*/

一旦我标记了重复所在的变量,我就可以比较相关变量并决定要保留或深入挖掘的内容。但我不禁想到有更优雅或更有效的方法来做到这一点。我想在这里学到一两件事。

有关更好解决方案的任何建议吗?

1 个答案:

答案 0 :(得分:2)

如果您只是想知道VarA_#是否包含除第一个之外的任何值,那么您可以使用tranwrdcountw来验证这一点。基本上,要求SAS将您的VarA_#设置为单个字符串,由您选择的分隔符分隔,然后使用tranwrd将您的第一个变量值的所有副本转换为缺失。然后计算剩余字符串中的单词数 - 0表示您只有第一个值,1或更高意味着您有一些不同的值。

data have;
  infile datalines truncover;
  input ResID   $ VarA_1   $ VarA_2   $ VarA_3   $ VarB_1   VarB_2   VarB_3;
datalines;
XAB2    Red      Ylw      Blu      13       13       13
BGH3    Grn       Grn       .         14       14
FHT1    Prp        .       .         13
;;;;
run;

data want;
  set have;
  array varA_[3];
  count_a = countw(catx(' ',of varA_[*]));
  count_a_diff = countw(tranwrd(catx(' ',of VarA_[*]),trim(varA_1),' '));
run;