请选择 进入手机版 | 继续访问电脑版
楼主: LiouPerng
6121 9

[原创博文] 关于使用SET语句连接的各数据集变量长度不一致时处理方式的一点困惑 [推广有奖]

  • 0关注
  • 1粉丝

初中生

85%

还不是VIP/贵宾

-

威望
0
论坛币
1279 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
130 点
帖子
15
精华
0
在线时间
12 小时
注册时间
2012-6-22
最后登录
2023-9-27

LiouPerng 发表于 2012-7-15 10:34:23 |显示全部楼层 |坛友微信交流群
1论坛币
  首先要检讨一下,我英语不好,所以可能影响理解。以下一小段文字摘抄自SAS官方的书"Step-by-Step Programming with Base SAS Software":
Using the SET Statement When Variables Have Different Lengths
If you use the SET statement to concatenate data sets in which the same variable
has different lengths, then the outcome of the concatenation depends on whether the
variable is character or numeric. The SET statement determines the length of variables
as follows:
􀀀 For a character or numeric variable, an explicitly defined length overrides a
default, regardless of the position of the data sets in the SET statement.
􀀀 If two or more data sets explicitly define different lengths for the same numeric
variable, then the variable in the new data set has the same length as the variable
in the data set that appears first in the SET statement.
􀀀 If the length of a character variable differs among data sets, whether or not the
differences are explicit, then the variable in the new data set has the same length
as the variable in the data set that appears first in the SET statement

其第1条和第3条,是不是有矛盾的地方呢?
假如有两个数据集a和b,其各自唯一的文本型变量v,长度分别为默认的8和指定的10,那么:
data n
set a b;
run;
该如何处理n中v的长度?
按照第1条,由于b中v是指定的10,因此长度为10。按照第3条,不管是不是指定的长度,都按a的v长度8来。
到底按哪种方式处理呢?

关键词:数据集变量 Set 数据集 step-by-step concatenate character different Software depends whether

回帖推荐

ziyenano 发表于2楼  查看完整内容

data n; length v $10; set a b; run;

本帖被以下文库推荐

ziyenano 发表于 2012-7-15 10:48:55 |显示全部楼层 |坛友微信交流群

data n; length v $10; set a b; run;

data n;
length v $10;
set a b;
run;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

使用道具

LiouPerng 发表于 2012-7-15 10:54:25 |显示全部楼层 |坛友微信交流群
ziyenano 发表于 2012-7-15 10:48
data n;
length v $10;
set a b;
我是想知道这句话表明的意义,我的理解错在哪里。

使用道具

ziyenano 发表于 2012-7-15 11:19:05 |显示全部楼层 |坛友微信交流群
LiouPerng 发表于 2012-7-15 10:54
我是想知道这句话表明的意义,我的理解错在哪里。
第一条的意思是,如果有明确定义长度(就是以length语句定义明确长度),都将覆盖原先的默认长度,不管数据集在set语句中的位置

使用道具

gds_1234 发表于 2012-7-15 15:43:21 |显示全部楼层 |坛友微信交流群
学习了

使用道具

LiouPerng 发表于 2012-7-15 15:47:40 来自手机 |显示全部楼层 |坛友微信交流群
ziyenano 发表于 2012-7-15 11:19
第一条的意思是,如果有明确定义长度(就是以length语句定义明确长度),都将覆盖原先的默认长度,不管数 ...
那么最后一句(字符类型)说,无论不同是不是指定的,新数据集的长度都按SET语句后的第一个数据集的长度来。这里的explicit指的是什么呢?再对比第二条讲的数值型变量,其最后一句也说按第一个长度来,它的explicitly又指什么呢?与字符型有什么不同?

使用道具

hongxx 发表于 2012-7-16 00:16:47 |显示全部楼层 |坛友微信交流群
LiouPerng 发表于 2012-7-15 15:47
那么最后一句(字符类型)说,无论不同是不是指定的,新数据集的长度都按SET语句后的第一个数据集的长度来 ...
意思是,
对于字符串,如果你在set a b的data步声明了变量var的长度,以你的声明为主,如果你没有声明,即使 a和b 各自在被创建的时候声明了其var长度,仍以set 后的第一个数据集该变量的长度为准(这里是a.var),

这与数值变量不一样,
数值变量如果set a b 的data步里 声明了var则以你的声明时为主,如果没有声明,则看 a和b谁对 var做了显示声明,比如a没有声明,而是默认格式,而b进行了声明,则以b.var为主;如果a和b都对var做了显示声明,则以第一个为主。
第1条主要是强调,你可以通过声明来覆盖其原有的长度。

使用道具

LiouPerng 发表于 2012-7-16 09:56:55 来自手机 |显示全部楼层 |坛友微信交流群
问题是长度的默认指什么。不像输入,输出格式,标签等,在使用DATASETS步查看数据集时,可能是缺失的,长度永远是有值的,如何知道它是默认的8还是指定的8呢?我提交了以下一个程序:
data a;
input c$ n;
datalines;
aa 123
;
run;
data b;
length c$4 n 4;
input c$ n;
datalines;
bbb 456
;
run;
data c;set a b;run;
data d;set b a;run;

结果C的两个变量长度全是8,D的两个变量全是4,如何才体现“默认”呢?是要与格式相关吗?如果是,在这本书中该段之前也讲到了格式不同时的规则,但这段中却没有说明默认长度是指那里的,初读怎么都会觉得这个长度就是指本身而非格式中的长度。

使用道具

LiouPerng 发表于 2012-7-16 09:58:07 来自手机 |显示全部楼层 |坛友微信交流群
问题是长度的默认指什么。不像输入,输出格式,标签等,在使用DATASETS步查看数据集时,可能是缺失的,长度永远是有值的,如何知道它是默认的8还是指定的8呢?我提交了以下一个程序:
data a;
input c$ n;
datalines;
aa 123
;
run;
data b;
length c$4 n 4;
input c$ n;
datalines;
bbb 456
;
run;
data c;set a b;run;
data d;set b a;run;

结果C的两个变量长度全是8,D的两个变量全是4,如何才体现“默认”呢?是要与格式相关吗?如果是,在这本书中该段之前也讲到了格式不同时的规则,但这段中却没有说明默认长度是指那里的,初读怎么都会觉得这个长度就是指本身而非格式中的长度。

使用道具

qiyabinq 发表于 2019-8-22 17:20:51 |显示全部楼层 |坛友微信交流群
在set 之前用了length声明了长度 但是set以后长的还是有缺失

使用道具

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

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

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

GMT+8, 2024-4-17 05:21