我收到了一个扁平文件,该文件将有关重复 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*/
一旦我标记了 dup 所在的变量,我就可以比较相关变量并决定保留或深入挖掘什么。但我忍不住认为有一种更优雅或更有效的方法可以做到这一点。我很想在这里学习一两件事。
有什么更好的解决方案建议吗?
如果您只想知道 VarA_# 中是否有除第一个值以外的任何值,则可以使用 tranwrd
和 countw
来验证这一点。 基本上,要求 SAS 将VarA_#
设置为单个字符串,由您选择的分隔符分隔,然后使用 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;