SAS中跨变量的递归命令

SAS中跨变量的递归命令,sas,Sas,如何将if语句应用于大量变量而不必重写条件。例如,假设我有一组变量性别,年龄,身高。。。(大约60个变量)我想指定条件 如果性别=。然后性别=-99; 如果年龄=。年龄=-99岁; . . . 数据集中存在的所有60个变量。有没有快速的方法可以做到这一点 谢谢使用数组 array arr{60} sex age height .... ; do i = 1 to 60; if arr{i} = . then arr{i} = -99; end; 这样说,考虑一下这样的缺失值是否真的是你想

如何将if语句应用于大量变量而不必重写条件。例如,假设我有一组变量性别,年龄,身高。。。(大约60个变量)我想指定条件

如果性别=。然后性别=-99; 如果年龄=。年龄=-99岁; . . . 数据集中存在的所有60个变量。有没有快速的方法可以做到这一点

谢谢使用数组

array arr{60} sex age height .... ;

do i = 1 to 60;
  if arr{i} = . then arr{i} = -99;
end;

这样说,考虑一下这样的缺失值是否真的是你想要做的。大多数SAS程序都知道缺少的值,并且能够以合理的方式处理它们;把它们变成一个数值会让你吃不消。例如,如果您尝试使用PROC SUMMARY计算总和或平均值,您的结果将不再有意义;同样,如果您尝试使用统计过程分析数据。

使用数组

array arr{60} sex age height .... ;

do i = 1 to 60;
  if arr{i} = . then arr{i} = -99;
end;

这样说,考虑一下这样的缺失值是否真的是你想要做的。大多数SAS程序都知道缺少的值,并且能够以合理的方式处理它们;把它们变成一个数值会让你吃不消。例如,如果您尝试使用PROC SUMMARY计算总和或平均值,您的结果将不再有意义;类似地,如果您尝试使用统计程序分析数据。

除了Hongi Ooi的答案之外,如果您想对数据集中的所有变量(听起来像是这样)进行分析,但又不想将其键入,则可以让SAS向您提供变量列表,以便输入数组

例如:

%macro getvars(dsn);
%global vlist;
proc sql;
    select name into :vlist separated by ' '
    from dictionary.columns
    where memname=upcase("&dsn");
quit;
%mend;
以下是本示例和其他示例的参考:

此外,如果您希望此函数也适用于字符串变量,则可能需要考虑使用缺失函数。


例如,如果缺失(var),则执行

除了Hongi Ooi的答案之外,如果您想对数据集中的所有变量执行此操作(听起来像是这样),但又不想将其键入,则可以让SAS向您提供变量列表,以便输入数组

例如:

%macro getvars(dsn);
%global vlist;
proc sql;
    select name into :vlist separated by ' '
    from dictionary.columns
    where memname=upcase("&dsn");
quit;
%mend;
以下是本示例和其他示例的参考:

此外,如果您希望此函数也适用于字符串变量,则可能需要考虑使用缺失函数。

例如,如果缺失(var),则执行

如果你真的想做所有的事情(或者列出你想做的事情)。STDIZE是SAS/STAT的一部分,所以希望您能拥有它


如果你真的想做所有的事情(或者列出你想做的事情)。STDIZE是SAS/STAT的一部分,所以希望您有它。

使用数组和
for
循环。SAS没有
for
,它是
do
循环;)此外,我非常失望地打开了这个线程,没有找到编写实际递归宏或FCMP例程的理由…使用数组和
for
循环。SAS没有
for
,它是
do
循环;)此外,我非常失望地打开了这个线程,却找不到编写实际递归宏或FCMP例程的理由…
array arr\u numeric\u似乎是正确的(就像海报上的那样)。
数组arr\u numeric\u似乎是正确的(就像海报上的那样)。在你的答案中加入链接中代码的相关部分是一个好主意;虽然包含详细信息和/或超出答案范围的链接,但SO中的答案通常应是自我完整的,无需参考其他网站。(获取更多信息)最好在您的答案中包含此处链接中代码的相关部分;虽然包含详细信息和/或超出答案范围的链接,但SO中的答案通常应是自我完整的,无需参考其他网站。(有关更多信息。)