SAS代码中SUM语句内*.、.B/.D/.Q等符号含义咨询
解读SAS代码片段:
SUM( (list=.)*. , (list=.B)*. , (list=.D)*. , (list=.Q)*. ) 先理清SAS的缺失值规则
SAS里的数值型缺失值分两种:
- 通用缺失值:用
.表示,是最常见的缺失值类型,无特定原因标记 - 特殊缺失值:用
.字母格式(比如.B、.D、.Q),用来区分不同原因的缺失(比如.B可能代表“空白输入”,.D代表“数据丢失”,具体含义由使用者自定义)
拆解代码里的每个部分
条件判断:
list=./list=.B等
这是元素级的布尔判断:对list中的每个元素,检查是否等于指定缺失值,符合条件返回1(真),不符合返回0(假)。
举个例子:如果list = [2, ., .B, 5],那么list=.的结果是[0,1,0,0],list=.B的结果是[0,0,1,0]。* .的作用
这是把布尔结果转成特定值的技巧,利用SAS的数值运算规则:- 非0数乘缺失值
.,结果还是.(比如1 * . = .) - 0乘任何数(包括缺失值),结果都是0(比如
0 * . = 0)
所以(list=.)*.的最终结果是:元素为通用缺失值.时输出.,否则输出0;同理(list=.B)*.是元素为.B时输出.,否则输出0。
- 非0数乘缺失值
SUM()函数的最终计算
SAS的SUM()函数会自动忽略缺失值,只对非缺失的数值求和。对list的每个元素来说:- 如果元素不属于这四类缺失值(
.、.B、.D、.Q),四个参数都是0,求和结果为0 - 如果元素属于其中一类缺失值,对应参数是
.,其他三个是0,SUM会忽略这个.,最终结果还是0
这种写法逻辑有点反常,大概率是代码意图出现了偏差——如果是想统计每个元素属于这四类缺失值的数量,正确写法应该去掉*.,直接写SUM( (list=.), (list=.B), (list=.D), (list=.Q) ),这样符合条件的元素会返回1,不符合返回0。
- 如果元素不属于这四类缺失值(
内容的提问来源于stack exchange,提问作者Kagaratsch
相关产品推荐
相关产品推荐

