Loops 在SAS中多次读取数据集

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语句。。。。。无论哪种方式,也尝试宏。有人能帮忙吗?谢谢你

我是新来的。我尝试多次读取数据集。例如,假设一个名为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语句。。。。。无论哪种方式,也尝试宏。有人能帮忙吗?谢谢你,约翰

后续行动

您好: 谢谢你的回复。那确实有效。我现在想做几件事,涉及循环中的一些“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%的数据样本。