Loops 在SAS中多次读取数据集
我是新来的。我尝试多次读取数据集。例如,假设一个名为temp的变量在一个名为tempfile的数据集中有3个观测值。三个观测值分别为4、6和5。。所以我想在集合中读取x的次数,第四个观测值是4,第五个是6,第六个是5。第七个是4,等等。我已经尝试了几十种方法,比如Loops 在SAS中多次读取数据集,loops,file-io,sas,Loops,File Io,Sas,我是新来的。我尝试多次读取数据集。例如,假设一个名为temp的变量在一个名为tempfile的数据集中有3个观测值。三个观测值分别为4、6和5。。所以我想在集合中读取x的次数,第四个观测值是4,第五个是6,第六个是5。第七个是4,等等。我已经尝试了几十种方法,比如 data new; do i=1 to 100; set tempfile; end; output; run; 我尝试过移动do语句、移动output语句、省略output语句。。。。。无论哪种方式,也尝试宏。有人能帮忙吗?谢谢你
data new;
do i=1 to 100;
set tempfile;
end;
output;
run;
我尝试过移动do语句、移动output语句、省略output语句。。。。。无论哪种方式,也尝试宏。有人能帮忙吗?谢谢你,约翰
后续行动
您好:
谢谢你的回复。那确实有效。我现在想做几件事,涉及循环中的一些“if-then”语句,而不仅仅是读取数据集。
我想在一个数据集中读取n次,每次都会有两个if-then语句
假设我读了3个数字,任意次数;7、15和12
读取每个数字时,它会询问是否小于10。每次都会产生一个随机数。
如果小于10,则
如果randuniform<.4,则将1添加到计数器1,否则将1添加到计数器2
如果>=10,
然后
如果randuniform<.2,则将1添加到计数器1,否则将1添加到计数器2
非常感谢您的帮助。
谢谢
John大多数数据步骤实际停止的方式是当SAS读取超过输入的末尾时。因此,您需要一种方法来防止SAS这样做 复制数据的最简单方法是只执行多个输出语句。第一条记录重复三次,第二条记录重复三次,以此类推
data want;
set tempfile ;
do i=1 to 3;
output;
end;
run;
另一种方法是在SET语句中多次列出数据集。所以要把它读三遍,只需使用
data want;
set tempfile tempfile tempfile;
run;
您可能会使用宏逻辑,甚至只是一个宏变量来使重复次数变为变量
data _null_; call symputx('list',repeat('tempfile ',3-1)); run;
data want; set &list; run;
另一种方法是在SET语句中使用POINT=和NOBS=选项,以便SAS永远不会读取超过末尾的内容,并且您可以跳回到开头。但由于它从不读取超过输入数据末尾的数据,因此需要手动告诉它何时停止
data want ;
do i=1 to 3;
do p=1 to nobs ;
set tempfile point=p nobs=nobs;
output;
end;
end;
stop;
run;
或者更像你的原始文章的精神,你可能想使用MOD函数来找出下一步要阅读的观察结果
data want;
if _n_ > 100 then stop;
p=1+mod(_n_-1,nobs);
set tempfile point=p nobs=nobs;
run;
大多数数据步骤实际停止的方式是当SAS读取超过输入端时。因此,您需要一种方法来防止SAS这样做 复制数据的最简单方法是只执行多个输出语句。第一条记录重复三次,第二条记录重复三次,以此类推
data want;
set tempfile ;
do i=1 to 3;
output;
end;
run;
另一种方法是在SET语句中多次列出数据集。所以要把它读三遍,只需使用
data want;
set tempfile tempfile tempfile;
run;
您可能会使用宏逻辑,甚至只是一个宏变量来使重复次数变为变量
data _null_; call symputx('list',repeat('tempfile ',3-1)); run;
data want; set &list; run;
另一种方法是在SET语句中使用POINT=和NOBS=选项,以便SAS永远不会读取超过末尾的内容,并且您可以跳回到开头。但由于它从不读取超过输入数据末尾的数据,因此需要手动告诉它何时停止
data want ;
do i=1 to 3;
do p=1 to nobs ;
set tempfile point=p nobs=nobs;
output;
end;
end;
stop;
run;
或者更像你的原始文章的精神,你可能想使用MOD函数来找出下一步要阅读的观察结果
data want;
if _n_ > 100 then stop;
p=1+mod(_n_-1,nobs);
set tempfile point=p nobs=nobs;
run;
数据步骤设计用于串行处理。在这种情况下,您需要记住以前的观察结果。您可以只使用数据步骤来完成,但对于该用例,SAS环境中还有其他更简单的解决方案。我建议使用一个宏,将原始文件追加n次:
%macro replicate( data=, out=, n=)/des='&out is &data repeated &n times.';
data &out;
set
%do i=1 %to &n;
&data
%end;
; /* This ; ends the data step `set` statement */
run;
%mend;
您可以使用以下帮助程序测试示例:
%macro test;
data have; /* create the example data set */
temp = 4; output;
temp = 6; output;
temp = 5; output;
run;
%replicate( data=have, out=want, n=4 );
proc print; quit;
%mend;
这是一个添加了许多示例的详细信息。数据步骤是为串行处理而设计的。在这种情况下,您需要记住以前的观察结果。您可以只使用数据步骤来完成,但对于该用例,SAS环境中还有其他更简单的解决方案。我建议使用一个宏,将原始文件追加n次:
%macro replicate( data=, out=, n=)/des='&out is &data repeated &n times.';
data &out;
set
%do i=1 %to &n;
&data
%end;
; /* This ; ends the data step `set` statement */
run;
%mend;
您可以使用以下帮助程序测试示例:
%macro test;
data have; /* create the example data set */
temp = 4; output;
temp = 6; output;
temp = 5; output;
run;
%replicate( data=have, out=want, n=4 );
proc print; quit;
%mend;
这里有很多例子,增加了很多细节。如果您有SAS/STAT软件SURVEYSELECT
data have;
do temp=4,6,5;
output;
end;
run;
proc surveyselect reps=10 rate=1 out=temp2 noprint;
run;
如果您有SAS/STAT软件调查,请选择
data have;
do temp=4,6,5;
output;
end;
run;
proc surveyselect reps=10 rate=1 out=temp2 noprint;
run;
这些是很好的建议,但您的第一个代码段将产生不同的顺序。这些是很好的建议,但您的第一个代码段将产生不同的顺序。您发布的代码将子集数据,而不是复制数据。它将每100次观测输出一次。因此,第一次迭代将读取100个观察值并输出最后一个。下一次迭代也会这样做,因此它将输出第200次观察结果,等等。因此,您将获得1%的数据样本。您发布的代码将子集数据,而不是复制数据。它将每100次观测输出一次。因此,第一次迭代将读取100个观察值并输出最后一个。下一次迭代将执行相同的操作,以便 将输出第200次观察,等等。因此,您将获得1%的数据样本。