全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2476 4
2018-10-25
悬赏 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。但似乎是不对的

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2018-10-25 23:17:01
啊 回答出来请申请奖励,我设置错了 变成1个了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

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)就会起作用.
不知道我理解的对不对,权当抛砖引玉
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

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.

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2019-1-24 23:40:27
SAS 从外部导入数据时,每次循环时都将变量置为缺失值,
有几种情况例外:
1、retain语句提到的变量
2、sum语句中创建的变量
3、数组_temporary_中的数据元
4、file和infile语句选项中创建的变量
5、自动变量
而从内部导入时只有第一次置为缺失值,后期只有以后变量保留其值直至新值写入
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群