2016-05-31 48 views
0

我收到了一个扁平化文件,该文件保留有关重复ID记录的信息,而不是附加变量,而不是附加记录。SAS - 比较变量内容和标记变化

例如,下面的数据集:

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*/ 

一旦我被标记的变量在其中的DUP住的话我可以比较相关变量并做出关于应该保留或深入研究的决定。但我不禁觉得有一个更优雅或有效的方式来做到这一点。我很想在这里学习一两件事。

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

回答

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; 
+1

为避免匹配单词的部分,需要在TRANWRD()函数调用中为两个参数添加分隔符。尽管它的名字TRANWRD()不知道一个词是什么。 – Tom

+1

@Tom如果数据中可能有部分词匹配,这是一个很好的观点。我现在不打算在答案中解决这个问题,如果你想这样做,请随时(在你自己的答案或以上)免费。 – Joe