SAS:回到以前的SAS Data Step观察可能吗?

时间:2011-05-11 09:04:07

标签: loops sas datastep

我也在RunSubmit上问过这个问题,因为SAS Q& A社区看起来有点分散。如果不感激,请告诉我。

在数据步骤中是否可以返回到先前/某个观察并从那里进一步通过数据集?

如果仍然不清楚,请添加问题,一个小例子:

数据集'work.test':

name  |   number   
John  |    1      
Jack  |    2  
Jane  |    3     
Jade  |    4       
Ronn  |    5       
Dick  |    6       
Sofy  |    7      
Sady  |    8      
Ruth  |    9      

数据步骤:

Data _null_;
 set work.test;
 File ...\test.txt;
 put name;
 if number = 5 and counter=3 then do;
   counter = counter+1;
   *return to obs where number = 3* AKA *set obs pointer back to obs with nr=3*;
 end;
run;

*问题是返回到数字= 1 的部分,而不是约 [和第一次] ,只是添加,因此它不会生成和无限循环。*

其他信息:
由于似乎仍然没有100%清楚我想要做什么,我在原始样本数据集和示例中添加了一些内容。 请记住它应该有点通用而不是固定代码。条件可能会在稍后变化。但主要的问题是:“是否有可能回到obs = X并且当你处于obs = Y时离开那里以及如何?”

背景资料: 这适用于使用包含xml流的单个表创建xml输出的整个故事,其中一些元素需要重复。不,由于旧的SAS版本,使用XML映射是不可能的。不,在这种情况下,消耗臭氧层物质也不适用。顺便说一句,这只是背景信息,因为“我仍然不知道你试图做什么”这句话不断出现;)

不适用于我的需求的可能性列表:

  • REWIND函数(仅返回第一个观察点)
  • LAG功能(获取变量的先前值,而不是返回到obs中)
  • 使用多个SET语句:这在我需要的方式上不是通用的(即一些数据集需要2个循环,其他数据集需要5个循环,因此有5个嵌套的SET语句......)

可以做什么:

  • 使用完整的SCL代码来完成数据步骤(推迟)
  • SET语句中的POINT选项(当前试用)
  • 哈希表:仍然需要做更多的研究,因为我对此知之甚少或如何实施。

2 个答案:

答案 0 :(得分:1)

SET语句属于可执行类型。

/* test data */
data one;
  input name $ num;
cards;
John 1 
Jack 2 
Jane 3 
Jade 4
;
run;

/* output obs until num=3 then output all */
data two;
   do until (num=3 or end1);
      set one end=end1;
      output;
   end;
   do until (end2);
      set one end=end2;
      output;
   end;
   stop;
run;

/* check */
proc print data=two;
run;
/* on lst
Obs    num    name

 1      1     John
 2      2     Jack
 3      3     Jane
 4      1     John
 5      2     Jack
 6      3     Jane
 7      4     Jade
*/

答案 1 :(得分:1)

SAS数据步骤主要是一次操作一个观察点,所以我相信sasfrog关于哈希对象的评论可能是你最好的选择。以下代码也可能有帮助(两个SET语句);但是我仍然不确定你的最终预期输出是什么,所以这只是一个粗鲁的例子。

data test1;
   set test;
   if number eq 5 then do;
      set test(rename=(name=name2 number=counter) where=(counter=3));
   end;
run;