2011-05-11 152 views
2

我在RunSubmit上也问过这个问题,因为SAS Q &社区似乎有点分散。如果不理解,请告诉我。SAS:返回到SAS数据步骤中的先前观察?

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

要添加的问题的情况下,它仍然是不明确的,一个小例子:

数据组 '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; 

*问题是关于部分返回obs其中number = 1,而不是 [和第一次],即只加这样就不会产生和无限循环*

附加信息:
,因为它似乎还不是100%清楚我想要做的,我加了一下,原来的样本数据设置和例子。只要记住它应该是一个通用的,而不是固定的代码。条件可能稍后会有所不同。但主要问题只是:“是否有可能回到obs = X,并且当你在obs = Y时从那里出发,怎么样?”

背景信息: 这适用于创建一个xml输出的全部过程,它使用一个保存xml流的表,其中一些元素需要重复。不,使用XML映射是不可能的,因为旧的SAS版本。不,在这种情况下,ODS也不适用。顺便说一句,这只是背景资料,因为这句话“我还是不knwo你尝试做”保持上来;)的并不适用于我的需求的可能性

列表:

  • 退功能(只返回第一个观察结果)
  • 滞后函数(获得变量的前一个值,而不是回到obs中)
  • 使用多个SET语句:这在我需要的方式中不是通用的(即一些数据集合需要2个循环,其他需要5个循环,因此5个嵌套SET语句...)

什么可以工作:

  • 使用的完整的SCL代码通过数据步骤(推迟)
  • 点选项在SET语句中去(目前试行)
  • 哈希表:还有做更多的研究,因为我对这个或者如何实施不太了解。
+3

是否[滞后](http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000212547.htm)功能可以帮助您?我不太清楚你想要做什么 - – 2011-05-11 13:57:33

+2

我建议探索[哈希和哈希迭代器对象](http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default /viewer.htm#a003143739.htm),它允许更多地控制您在给定数据集内的位置。 – sasfrog 2011-05-11 22:48:30

+0

@Louisa:我也发现了这个函数,但是它不会真的有帮助,因为它和retain语句有些相似。然后,我需要“滞后”(或者通过太多的观察“保留”太多的值)@sasfrog:我会仔细研究它,但乍一看它并不是我所需要的。 无论如何,谢谢! – Yoh 2011-05-12 11:49:12

回答

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 
*/ 
+0

这确实适用于所提到的简单例子,但恐怕它不是我打算使用的通用类型。另外你的解决方案并不适用,因为我想去* 1号的观察*这不是第一次观察(是的,例子不是最好的)。 另一件事是它不是通用的方式,我想多次回去。 IE浏览器。首先从obs与nr3到nr2循环3次,然后在eof循环遍历整个集合5次,包括第一个循环。 (也会将此添加到问题中) – Yoh 2011-05-12 11:32:56

+0

@Yohsoog从您在此评论中描述的内容可以确定,您肯定希望使用散列对象。哈希对象将一些数据存储在内存中,您可以使用它来查找某些记录,遍历它们等等。就您而言,您甚至可以使用一个来记录您“循环”的次数。稍后尝试发布一个例子 - 我现在在网站上。 – sasfrog 2011-05-13 03:44:44

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

好吧我真的应该看看哈希对象的东西。但是恐怕你的建议,就像张忠的意见不是我正在寻找的,但是无论如何,谢谢。我也更新了这个问题,希望这可以提高对我所做的事情的理解。 – Yoh 2011-05-13 08:39:06