在 SAS 数据步骤中设置重复的数据集

发布于 2024-11-19 09:09:21 字数 494 浏览 3 评论 0原文

假设我有一个如下所示的 SAS 数据集:

id  x
1   1234
2   2345
3   3456

我需要一个新的数据集,该数据集被读取(比如说)2 次,并有一个新变量指示这是哪个“复制”:

id  x     rep
1   1234  1
2   2345  1
3   3456  1
1   1234  2
2   2345  2
3   3456  2

读取数据很重要按照这个确切的顺序——整个初始数据集被读取一次,然后再次读取,等等。

关于在数据步骤中执行此操作的有效方法有什么想法吗? (实际上我的数据集很大,我需要多次读取它,并且我想避免排序。)

我尝试了这个,但是新数据集中的观察顺序不是我想要的:

data foo;
 set tmp; rep=1; output;
 set tmp; rep=2; output;
run;

Suppose I have a SAS dataset that looks like this:

id  x
1   1234
2   2345
3   3456

I need a new data set that has this data set read in (say) 2 times, with a new variable indicating which "replication" this is:

id  x     rep
1   1234  1
2   2345  1
3   3456  1
1   1234  2
2   2345  2
3   3456  2

It is important that the data are read in this exact order -- the entire initial data set is read once, then again, etc.

Any ideas on an efficient way to do this in a data step? (In reality my data set is huge, I need to read it several times, and I want to avoid sorting.)

I tried this, but the order of the observations in the new data set is not what I want:

data foo;
 set tmp; rep=1; output;
 set tmp; rep=2; output;
run;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

老街孤人 2024-11-26 09:09:21

如果您想保持数据步骤,那么这将按照您所描述的方式工作。

data foo;
  set tmp (in=INA) tmp (in=INB);
  if INA then REP=1;
  if INB then REP=2;
run;

If you want to keep to data step, then this will work as you described.

data foo;
  set tmp (in=INA) tmp (in=INB);
  if INA then REP=1;
  if INB then REP=2;
run;
别理我 2024-11-26 09:09:21
data rep;
  set tmp;

  do rep = 1 to 2; /* or 3, or whatever */
    output;
  end;
proc sort;
  by rep id;
run;

就是这样。

data rep;
  set tmp;

  do rep = 1 to 2; /* or 3, or whatever */
    output;
  end;
proc sort;
  by rep id;
run;

That's it.

左秋 2024-11-26 09:09:21

您可以尝试使用视图和过程附加,如下所示:

/* create view for rep=2 */

data rep2 / view=rep2;
 set tmp;
 rep = 2;
run;

/* create dataset for rep=1 */

data foo;
 set tmp;
 rep = 1;
run;

/* append rep=2 to rep=1 dataset */

proc append base=foo data=rep2;
run;

You could try it using a view and proc append like this:

/* create view for rep=2 */

data rep2 / view=rep2;
 set tmp;
 rep = 2;
run;

/* create dataset for rep=1 */

data foo;
 set tmp;
 rep = 1;
run;

/* append rep=2 to rep=1 dataset */

proc append base=foo data=rep2;
run;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文