SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 787|回复: 5
打印 上一主题 下一主题

关于 _n_ 的一个问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-8-12 23:36:35 | 只看该作者

关于 _n_ 的一个问题

下面这段code是为了随机取一些data comp的记录:

data comp;
input x1 x2 x3 f;
cards;
1 1 1 4
1 2 1 5
2 1 1 3
2 2 1 2
1 1 2 1
1 2 2 8
2 1 2 7
2 2 2 6
;
run;
data one;
set comp;
if _n_=rantbl(1230,0.2,0.3,0.5);
run;
data three;
set comp;
if _n_=3;
run;
data two;
a=rantbl(1230,0.2,0.3,0.5);
run;
proc print data=comp;
run;
proc print data=one;
run;
proc print data=two;
run;
proc print data=three;
run;

data one和data three的结果在输出中看到的是不同的:
data one:               Obs    x1    x2    x3    f
                                     1      1     2     1    5
                                     2      2     1     1    3
data three:                Obs    x1    x2    x3    f
                                     1      2     1     1    3
为什么会有这种问题呢?是不是和_n_的某些原理相关呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-8-13 06:05:53 | 只看该作者

Re: 关于 _n_ 的一个问题

rantbl()按照20%,30% 和50%的几率生成1, 2 或3 这三个数。所以,你只能在前三个记录上打转儿。
data1有两个碰上了,所以两个记录;data3:_n_ =3; 所以一个记录...
其实说来说去,我都不明白你在问什么你要干什么。抱歉。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-8-13 09:34:30 | 只看该作者

Re: 关于 _n_ 的一个问题

我觉得 rantbl() 应该是得出一个数吧

那么生成data one 的时候也就该只有一条记录呀

怎么会在结果里出来两条记录呢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-8-13 09:46:43 | 只看该作者

Re: 关于 _n_ 的一个问题

原来疑惑在这里。data step里的dataset ,也就是comp, 里的行是个暗含的循环(恰当吗?)也就是说一条记录要执行一次,也就是说,因为set comp里有8条记录,所以rantbl()要执行8次,同时也做了8次判断。在这8次里,恰巧有2个生成的数和_n_(=12。。。8)是吻合的,故此输出。data2里没有set,所以没有隐藏的循环(?)也没有明确的do loop循环,那么一条命令只执行一次了。所以只有一个记录。data3做8次判断,因_n_ unique, 所以只有一次成立因而输出一条记录。
我讲的不好,但是有人讲得好。你看看他们是怎么说的。不过,这应该是sas入门最关键的概念之一了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-8-13 11:36:50 | 只看该作者

Re: 关于 _n_ 的一个问题

楼上的大牛讲的真好,第二个data里,set的循环是每次都和固定值3做比对,所以就只保留一次记录。豁然开朗啊。

我不是主要用sas,就是拿一些code看着学的......
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-8-18 00:20:36 | 只看该作者

Re: 关于 _n_ 的一个问题

run the following SAS code mulitple times, and check the SAS log, and you may totally understand how this procdure works.[code:ebt00j6h]data one;
set comp;
if _n_=rantbl(0,0.2,0.3,0.5);
putlog _all_;
run;[/code:ebt00j6h]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 01:29 , Processed in 0.070305 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表