Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance SAS-比较变量内容和标记变化_Performance_Sas_Duplicates_Compare - Fatal编程技术网

Performance SAS-比较变量内容和标记变化

Performance SAS-比较变量内容和标记变化,performance,sas,duplicates,compare,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

我收到了一个扁平文件,该文件将有关重复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”相关联的所有变量都被展平为一个记录,因此所有信息都可以保留,但数据集仍然可以作为个人级别的文件处理

这很酷。但现在我需要协调DUP之间的差异

我目前计划在数据步骤中编写一系列非常无聊的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*/
一旦我标记了DUP所在的变量,那么我就可以比较相关的变量,并决定保留或深入挖掘什么。但我忍不住认为有一种更优雅、更有效的方法可以做到这一点。我很想在这里学到一两件事


有没有更好的解决方案的建议?

如果您只想知道VarA#是否有第一个以外的值,那么您可以使用
tranwrd
countw
来验证这一点。基本上,请SAS将您的
VarA_35;
设置为一个字符串,由您选择的分隔符分隔,然后使用
tranwrd
将第一个变量值的所有副本转换为missing。然后计算剩余字符串中的字数-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;

如果您只想知道VarA#是否包含除第一个以外的任何值,那么您可以使用
tranwrd
countw
来验证这一点。基本上,请SAS将您的
VarA_35;
设置为一个字符串,由您选择的分隔符分隔,然后使用
tranwrd
将第一个变量值的所有副本转换为missing。然后计算剩余字符串中的字数-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;

要避免匹配单词的某些部分,需要在TRANWRD()函数调用中为两个参数添加分隔符。尽管名称为TRANWRD(),但它不知道单词是什么。@Tom如果数据中可以进行部分单词匹配,这是一个很好的观点。我暂时不打算在答案中说明这一点,如果您想这样做,请随意(在您自己的答案或更高版本中)。为了避免匹配单词的某些部分,您需要在TRANWRD()函数调用的两个参数中添加分隔符。尽管名称为TRANWRD(),但它不知道单词是什么。@Tom如果数据中可以进行部分单词匹配,这是一个很好的观点。我现在不打算在回答中提到这一点,如果你想这样做,请随意(在你自己的答案或以上)。