我是新来的。我试图多次读入数据集。例如,假设我在一个名为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 任何帮助深表感谢。 谢谢 约翰
答案 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,其中添加了许多详细信息。