2017-02-04 104 views
1

我是新来的。我正在尝试多次读入数据集。例如,假设我在一个名为temp的变量的数据集(称为tempfile)中有3个观测值。三个观测值分别是4,6和5 ..所以我想要读取集合x的次数,所以第四个观察值是4,第五个是6和第六个,是5,第7个是4,等等等我都试过这个字面上几十方式,通过执行类似在SAS中多次读取数据集

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

我已经通过移动做陈述,移动输出语句,省略输出语句.....每哪种方式尝试这个,也尝试宏。有人可以帮忙吗?感谢约翰

后续....

您好: 感谢响应。这确实奏效。我现在想做几件涉及循环内部的“if then”语句的东西(不仅仅是读取数据集)。 我想在一个数据集中读取n次,每次都会有两个if语句 因此,假设我用3个数字读取任意次数; 7,15和12 读取每个数字后,它会询问它是否小于10.并且每次都会创建一个随机数。 如果小于10,则 如果兰特(均匀)< 0.4然后将1添加到计数器1,否则将1加到计数器2 如果> = 10, 然后 如果兰特(均匀)< 0.2然后1是添加到counter1,否则1被添加到counter2 任何帮助,非常感谢。 谢谢 约翰

+1

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

回答

3

大多数数据步骤实际停止的方式是当SAS读取输入结束时。所以你需要一种防止SAS做到这一点的方法。

复制数据的最简单方法是仅执行多个输出语句。因此,第一个记录重复三次,然后第二个记录重复三次,等

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; 
+0

这些建议很好,但你的第一个片段会产生不同的顺序。 – Leo

+0

谢谢汤姆,看看这些 – GKJohn

0

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

+0

感谢狮子座,我会试试看。 – GKJohn

3

如果您有SAS/STAT软件SURVEYSELECT。

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