楼主: 消散2
2153 4

[问答] 有关set两个数据集的PDV过程 [推广有奖]

  • 0关注
  • 0粉丝

本科生

33%

还不是VIP/贵宾

-

威望
0
论坛币
322 个
通用积分
4.0000
学术水平
1 点
热心指数
2 点
信用等级
1 点
经验
1764 点
帖子
12
精华
0
在线时间
160 小时
注册时间
2016-3-25
最后登录
2022-5-15

1论坛币
data a;
    input x y;
    cards;
1 2
3 4
;
run;

data b;
    input x;
    cards;
3
6
;
run;

data c;
    set a b;
    if missing(y) then y=x;
run;

output:
x    y      obs
1    2       1
3    4       2
3    3       3
6    3       4

obs=4 的y值是不正确的,我推测是PDV过程我理解不清楚。我之前的理解是set a b;就是先一条一条读a的数据集然后再一条一条读b。但似乎是不对的

关键词:数据集 正确的 不清楚
沙发
消散2 发表于 2018-10-25 23:17:01 |只看作者 |坛友微信交流群
啊 回答出来请申请奖励,我设置错了 变成1个了

使用道具

藤椅
hsubin 在职认证  发表于 2018-10-26 03:48:04 |只看作者 |坛友微信交流群
我觉得楼主理解的没错,concatanate 多个数据集时应该就是逐个数据集逐条读取到PDV中的.
这个例子可能是因为set (merge, modify, update)中的变量自动retain(Causes a variable that is created by an INPUT or assignment statement to retain its value from one iteration of the DATA step to the next.). 如果把dataset a 中变量y 改成 z, 这时missing(y)就会起作用.
不知道我理解的对不对,权当抛砖引玉

使用道具

板凳
wwang111 发表于 2018-10-26 11:19:02 |只看作者 |坛友微信交流群
我是这样理解的:

因为是set a b, 所以data步读取数据集a中所有记录的过程,数据集a的变量是retain的,数据集b也是如此;

所以,数据步的前两圈应该比较容易,就是把数据集A的两条记录output到了数据集C里面;
此时A的记录读取完毕,PDV要初始化,所以在第三圈开始执行前变量x, y都是missing的;
第三圈,读取数据集B,x=3进入数据集C,此时,y值是missing,执行到下面的if语句,就变成了x的值,就是3;
到了最后一圈,x=6进入数据集C,但是变量y因为是数据集A或B中的变量,是retain的,所以y=3也retain到了数据集C中,下面的if语句就不会执行了,最后一条的y值还是3.

使用道具

报纸
xy_ycl 发表于 2019-1-24 23:40:27 |只看作者 |坛友微信交流群
SAS 从外部导入数据时,每次循环时都将变量置为缺失值,
有几种情况例外:
1、retain语句提到的变量
2、sum语句中创建的变量
3、数组_temporary_中的数据元
4、file和infile语句选项中创建的变量
5、自动变量
而从内部导入时只有第一次置为缺失值,后期只有以后变量保留其值直至新值写入

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-24 19:17