在SAS中多次读取数据集

时间:2017-02-04 01:57:04

标签: loops file-io sas

我是新来的。我试图多次读入数据集。例如,假设我在一个名为temp的变量的数据集(称为tempfile)中有3个观察值。三个观察结果是4,6和5 ..所以我想在集合中读取x次数,因此第4次观察将是4次,第5次将是6次和第6次,将是5.第7次将是4次,等等通过做类似

之类的事情,我已经尝试了几十种方法
data new;
do i=1 to 100;
set tempfile;
end;
output;
run;

我试过这个,通过移动do语句,移动输出语句,省略输出语句.....每个方向,也尝试宏。有人可以帮忙吗?谢谢约翰

...后续

您好: 谢谢你的回复。这确实有效。我现在想做一些涉及循环内部“if then”语句的事情(不仅仅是读取数据集)。 我想在数据集中读取n次,每次都会有两个if语句 所以,假设我多次读了3个数字; 7,15和12 当读取每个数字时,它将询问它是否小于10.并且每次它将创建一个随机数。 如果小于10,那么 如果兰德(均匀)< .4然后将1添加到counter1,否则将1添加到counter2 如果> = 10, 然后 如果兰德(均匀)< .2然后将1添加到counter1,否则将1添加到counter2 任何帮助深表感谢。 谢谢 约翰

3 个答案:

答案 0 :(得分: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;

其他方法是使用POINT=语句中的NOBS=SET选项,以便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;

答案 1 :(得分:3)

如果您有SAS / STAT软件SURVEYSELECT。

import csv
import string
import random

with open('input.csv') as fin:
  with open('output.csv', 'w') as fout:
    writer = csv.writer(fout)
    for row in csv.reader(fin):
      # random string of length 6 consisting of any upper/lower case ascii letters
      rand_str = ''.join(random.choice(string.lowercase) for x in range(6))
      writer.writerow(row + [rand_str])

答案 2 :(得分: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,其中添加了许多详细信息。