删除SAS中相同的列

删除SAS中相同的列,sas,duplicate-removal,Sas,Duplicate Removal,我正在处理一个非常大的数据集,其中多次包含相同的列,但列名不同(字符和数字)。 有人知道如何查找和删除这些相同的列吗 示例 A B C D E F G 12 ab 12 ab 8 h 12 14 cd 14 cd 65 j 14 6 fs 6 fs 3 g 6 . . . . 4 q . 3 d

我正在处理一个非常大的数据集,其中多次包含相同的列,但列名不同(字符和数字)。 有人知道如何查找和删除这些相同的列吗

示例

A    B      C     D     E    F    G
12   ab     12    ab    8    h   12
14   cd     14    cd    65   j   14
6    fs      6    fs    3    g    6
.     .      .     .    4    q    .
3     d      3     d    5    d    3
A-G
是变量名,我希望能够看到
A
C
G
是相同的,然后删除除一个之外的所有变量名。 而且
B
D
是相同的。我只想留一个


这可能吗?

以下是使用陈胜林在评论中提出的技术的示例

data have ;
 input A B $ C D $ E F $ G ;
cards;
12 ab 12 ab 8 h 12
14 cd 14 cd 65 j 14
6 fs 6 fs 3 g 6
. . . . 4 q .
3 d 3 d 5 d 3
;;;;
查找唯一的数字列

proc transpose data=have out=tall_numbers ;
  var _numeric_;
run;
proc sort data=tall_numbers nodupkey out=keep_numbers(keep=_name_); 
  by col: ;
run;
查找唯一字符列

proc transpose data=have out=tall_characters ;
  var _character_;
run;
proc sort data=tall_characters nodupkey out=keep_characters(keep=_name_); 
  by col: ;
run;
获取列的组合列表

proc sql noprint ;
  select _name_ 
  into :keep_list separated by ' ' 
  from (select _name_ from keep_characters
  union select _name_ from keep_numbers)
  order by 1
  ;
quit;
仅使用唯一列创建新表

data want ; 
  set have ;
  keep &keep_list ;
run;

多大是非常大的?(行数和列数可能会有帮助)大约40000行和400列分别转置数字变量和字符变量,然后排序以删除重复记录,转置回原处并将数字变量与字符变量合并。观察结果的顺序重要吗?对于数值变量,你可以考虑运行一个相关矩阵——任何与1相关的任何东西都可能是一个复制品。你有SAS/IML(这个数据足够小吗?你可以在IML中使用它)吗?我想知道IML是否允许一种更有效的方法。汤姆,这在我的情况下是有效的。非常感谢你!你知道怎样才能看出哪些变量是相同的吗?使用一个简单的“proc compare”,我可以看到哪些变量被删除了,但我不知道如何指出被删除的变量与其余变量中的哪些相同。如果能做到这一点,那将是一个很大的帮助。在本例中,这将对应于A、C和G是相同变量的指示,或者C和G由于A或类似的原因被删除。变量B和D也是如此。删除排序上的NODUPKEY和KEEP=选项,然后使用数据步骤。您需要知道原始数据集中有多少个观测值(易于获取)。我们称之为&N.
数据组;设置高数值;col1 col&n;如果不是(第一列和最后一列);组+第一列;保留组名称;运行使用数据“keep_numbers”而不是“tall_numbers”,这是应该的。谢谢。额外的数据步骤不适用于40000行。我的计算机无法处理此问题。我发现版本8的SAS/Share只能支持32767个变量的引用。不确定9.4版是否仍然有这个限制,但40000是一个有很多变量!我认为这种方法不适合这么多的观察。