【问题标题】:reading a data set multiple times in SAS在 SAS 中多次读取数据集
【发布时间】:2017-02-08 08:42:28
【问题描述】:

我是新来的。我正在尝试多次读取数据集。例如,假设我在数据集(称为 tempfile)中有 3 个观测值,用于一个名为 temp 的变量。三个观察值是 4,6 和 5 .. 所以我想在集合 x 中阅读次数,所以第 4 个观察值是 4,第五个是 6,第六个是 5。第 7 个是 4,依此类推等等。我已经尝试了几十种方法,比如

data new;
do i=1 to 100;
set tempfile;
end;
output;
run;

我已经通过移动 do 语句、移动输出语句、省略输出语句来尝试这个......各种方式,也尝试使用宏。有人可以帮忙吗?谢谢约翰

跟进....

你好: 感谢您的回复。那确实奏效了。我现在想做几件事,涉及循环内的一些“if then”语句(不仅仅是读取数据集)。 我想读入一个数据集n次,每次都会有两个if then语句 所以,假设我读了 3 个数字任意次数; 7、15 和 12 当每个数字被读取时,它会询问它是否小于 10。并且每次它都会创建一个随机数。 如果小于 10,则 如果 rand(uniform) = 10, 然后 如果 rand(uniform)

【问题讨论】:

  • 您发布的代码将子集数据而不是复制它。它将每 100 个观测值输出一次。所以第一次迭代将读取 100 个观察值并输出最后一个。下一次迭代将执行相同的操作,因此它将输出第 200 个观察值等。因此您将获得 1% 的数据样本。

标签: loops file-io sas


【解决方案1】:

大多数数据步骤实际停止的方式是当 SAS 读取超过输入末尾时。所以你需要一种方法来阻止 SAS 这样做。

复制数据的最简单方法是执行多个输出语句。所以第一条记录重复 3 次,然后第二条记录重复 3 次,以此类推。

data want;
  set tempfile ;
  do i=1 to 3;
    output;
  end;
run;

另一种方法是在SET 语句中多次列出数据集。因此,只需使用 3 次阅读它即可

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;

【讨论】:

  • 这些是很好的建议,但您的第一个 sn-p 会产生不同的顺序。
【解决方案2】:

如果您有 SAS/STAT 软件 SURVEYSELECT。

data have;
   do temp=4,6,5;
      output;
      end;
   run;
proc surveyselect reps=10 rate=1 out=temp2 noprint;
   run;

【讨论】:

    【解决方案3】:

    数据步是为串行处理而设计的。在这种情况下,您需要“记住”以前的观察结果。您可以仅使用数据步骤来执行此操作,但对于该用例,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;
    

    这里是a portion of the SAS doc,它通过许多示例添加了很多细节。

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      相关资源
      最近更新 更多