SAS中跨变量的递归命令
如何将if语句应用于大量变量而不必重写条件。例如,假设我有一组变量性别,年龄,身高。。。(大约60个变量)我想指定条件 如果性别=。然后性别=-99; 如果年龄=。年龄=-99岁; . . . 数据集中存在的所有60个变量。有没有快速的方法可以做到这一点 谢谢使用数组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; 这样说,考虑一下这样的缺失值是否真的是你想
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中的答案通常应是自我完整的,无需参考其他网站。(有关更多信息。)