2

我也在 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;

*问题是关于返回到 obs 的部分,其中 number = 1,而不是关于 [and first time],只是添加了它,因此它不会生成无限循环。*

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

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

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

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

什么可以工作:

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

2 回答 2

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;
于 2011-05-13T00:36:22.977 回答
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
*/
于 2011-05-11T20:05:28.590 回答