【发布时间】: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 选项进行测试。我现在需要解决的唯一问题是创建和维护包含最大增量数和这些增量的当前计数的通用变量。