我也在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映射是不可能的。不,在这种情况下,消耗臭氧层物质也不适用。顺便说一句,这只是背景信息,因为“我仍然不知道你试图做什么”这句话不断出现;)
不适用于我的需求的可能性列表:
可以做什么:
答案 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;