【问题标题】:SAS: Return to previous observation in SAS Data Step possible?SAS:返回之前在 SAS 数据步骤中的观察可能吗?
【发布时间】:2011-08-23 03:13:51
【问题描述】:

我也在 RunSubmit 上问过这个问题,因为 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;

*问题是关于 return to obs where number = 1 的部分,而不是关于 [和第一次] ,只是添加它不会生成无限循环。*

附加信息:
由于似乎仍然不是 100% 清楚我想要做什么,我在原始样本数据集和示例中添加了一些内容。 请记住,它应该有点通用,而不是固定代码。以后情况可能会有所不同。但主要问题只是:“是否有可能回到 obs=X 并在您处于 obs=Y 时从那里继续?如何?”

背景信息: 这适合使用包含 xml 流的单个表创建 xml 输出的整个故事,其中一些元素需要重复。不,由于旧 SAS 版本,无法使用 XML 映射。不,ODS 也不适用于这种情况。顺便说一句,这只是背景信息,因为'我仍然不知道你想做什么'的评论不断出现;)

不适合我需要的可能性列表:

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

什么可以起作用:

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

【问题讨论】:

  • lag 功能对您有帮助吗?我不太确定你想做什么-
  • 我建议探索hash and hash iterator objects,它可以更好地控制您在给定数据集中的位置。
  • @Louisa:我也发现了这个函数,但它不会真正有帮助,因为它有点类似于保留语句。然后我需要“滞后”(或通过太多观察“保留”太多值)@sasfrog:我会更多地研究它,但乍一看它并不是我特别需要的。还是谢谢!
  • 我现在正在使用 SET 语句的 POINT 选项进行测试。我现在需要解决的唯一问题是创建和维护包含最大增量数和这些增量的当前计数的通用变量。

标签: loops sas datastep


【解决方案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 的观察 这不一定是第一次观察(是的,示例不是最好的)。另一件事是它不是我想要多次返回的通用方式。 IE。第一次从带有 nr3 的 obs 到 nr2 循环 3 次,然后在 eof 再次循环整个集合 5 次,包括第一个循环。 (也会将此添加到问题中)
  • @Yohsoog 好的,根据您在此评论中的描述,您肯定想要使用哈希对象。哈希对象将一些数据存储在内存中,您可以使用它来查找某些记录,遍历它们等。在您的情况下,您甚至可以使用一个来跟踪您“循环”了多少次。稍后将尝试发布示例 - 我现在在现场。
【解决方案2】:

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;

【讨论】:

  • 好吧,我真的应该研究一下哈希对象的事情。但我担心你的建议,就像长中的一样,不是我想要的,但无论如何,谢谢。我还更新了这个问题,希望这有助于理解我尝试做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多