如何为所有列声明一个数组并保留变量名?

时间:2015-02-13 19:20:31

标签: sas

假设我有一个包含100列的数据集。有没有办法可以为所有这些列创建一个数组并仍然保留变量名称?

我知道你可以这样做:

 array var{*} n1-n100 ;

但我想保留原始变量名称。有没有办法可以做到这一点?我基本上想要遍历数组并只保留少数几个变量。

3 个答案:

答案 0 :(得分:2)

如果所有变量都是相同的类型,即数字或字符,您可以使用 numeric 字符的简写

array var(*) _numeric_;

答案 1 :(得分:2)

如果要引用的变量在列顺序中形成一个不间断的范围(并且都是相同类型),则可以使用双破折号列表将它们放入数组中,仅引用第一个和最后一个变量。 E.g。

data _null_;
    set sashelp.class(obs = 1);
    array example[*] age--weight;
    dim = dim(example);
    put dim=;
run;

答案 2 :(得分:1)

如果我们假设这是来自您的另一个问题(关于阅读.CSV并只保留几列),那么有一个有趣的解决方案,假设您的数据不是太狂野和疯狂。

首先,几点说明。您不能仅使用数据步骤代码有条件地保留变量。

if x>1 then keep y;

这不起作用。它总是保持y。保持/删除/重命名(以及一些其他语句,称为compile-time statements,不允许依赖于数据:它们的效果是在数据步骤的编译过程中定义的。这涉及相对复杂的SAS细节,但是无论长短不一,你都不能有条不紊地使用Drop,Keep,Rename,而不必使用宏语言。

其次,请注意,如果您知道要保留的列的名称,只需将它们放在keep语句中即可。迭代数组并不会对你有所帮助,除非你试图通过某种数据值有条件地做到这一点,如上所述,这是不可能的。

然而,如果您从CSV文件(或任何其他输入法)读入,可以做一些与众不同的事情,这将完全做到你想要它,允许你通过选择特定的列有效地读取分隔文件。我发布了那个部分作为你的其他问题的主副本here的答案,因为它在那里真的更合适(鉴于你的问题在这里没有引用CSV文件或其他类似的东西),但我怀疑它会很有用。