楼主: the_fly_winds
4319 4

[程序分享] SAS加不加冒号真的有区别吗? [推广有奖]

  • 0关注
  • 1粉丝

博士生

5%

还不是VIP/贵宾

-

威望
0
论坛币
1187 个
通用积分
6.3200
学术水平
16 点
热心指数
24 点
信用等级
14 点
经验
2330 点
帖子
105
精华
0
在线时间
257 小时
注册时间
2014-9-28
最后登录
2024-4-11

30论坛币
程序很简单!

数据源就两个:
  1. a 01-31-89
  2. b  12-25-87
复制代码
程序如下:
  1. proc datasets kill nolist;run;

  2. data a;
  3. infile'C:\Users\a\Desktop\SAS\a.txt';
  4. input id $ time mmddyy8.;
  5. /*format time yymmdd8.;*/
  6. run;

  7. data b;
  8. infile'C:\Users\a\Desktop\SAS\a.txt';
  9. input id $ time : mmddyy8.;
  10. /*format time yymmdd8.;*/
  11. run;
复制代码
如果不注释掉format语句, 那么这两段程序的结果是一模一样的.

注释掉之后, 很神奇的是, time返回的数值居然不一样.

这是为什么呢?

加不加冒号又有什么区别呢?

有一道sas选择题, 说必须加冒号," colon is required to associate the informat with the variable."但是好像并没有区别啊!??

最佳答案

mich_ard 查看完整内容

楼上的回答是对的。冒号是一种输入格式修饰符(其他修饰符还包括,&,~,#,@等)。没有冒号时,b 是formatted column input,按格式(mmddyy8.) 输入的是“ [/backcolor]12-25-8” (注意,最前面 [/backcolor]代表1空格)。加冒号使其成为 list input,数据不再是严格的w的宽度,而是类似于分隔符分隔(无论多少空格都被当成了一个空格),输入结果将是 “12-25-87” 。当你有多个数据,而且数据前的空格数多少不一时,这个方法特 ...
关键词:Associate informat required datasets Variable Desktop 选择题 数据源 Users 程序
沙发
mich_ard 发表于 2016-12-3 17:32:49 |只看作者 |坛友微信交流群
楼上的回答是对的。冒号是一种输入格式修饰符(其他修饰符还包括,&,~,#,@等)。没有冒号时,b 是formatted column input,按格式(mmddyy8.) 输入的是“ 12-25-8” (注意,最前面 代表1空格)。加冒号使其成为 list input,数据不再是严格的w的宽度,而是类似于分隔符分隔(无论多少空格都被当成了一个空格),输入结果将是 “12-25-87” 。当你有多个数据,而且数据前的空格数多少不一时,这个方法特别有用。

举一例:在所有3个observation中,DOB 和 salary前的空格数都不一样。

data example;
input Subj $3.  Name & $20.  DOB : mmddyy10.  Salary : dollar8.;
format DOB date9. Salary dollar8.;
cards;
001 Christopher Mullens  11/12/1955 $45,200        /*DOB 和 salary前的空格数分别是2,1*/
002 Michelle Kwo         9/12/1955  $78,123           /*DOB 和 salary前的空格数分别是9,2*/
003 Roger W. McDonald    1/1/1960   $107,200     /*DOB 和 salary前的空格数分别是4,3*/  

run;

(注,& 是另一个修饰符,以后我将另文介绍。意思是遇到连续2个空格即停止,不需要严格执行此处的宽度20)

55555.jpg


此外,冒号还有很多其他用法,简单介绍一下:

1,表示遇到单个空格就停止(不需要严格执行宽度,即使只有短至3个字符,如下例,也要停止,) --> (比较上面提到的 & ,遇到连续2个空格即停止)。

data test1;
input univ :$12. ranking country $;
cards;
BeijingU 1 China
MIT 2 USA
UCalifornia 3 USA

88888.jpg

2,表示“以 ... 开始” (begin with)。常和各种比较操作符(如=,>, >= 等)结合使用。如 :

data test2;
input id name $;
if name = :'B' then delete;    /*删除以B打头的名字*/
cards;
01 Bevan
02 Posley
03 Owen
04 Burden
;

77777.jpg

(如果 if 句改为, if name > :'B' then delete;  结果将是 1 Bevan 和 4 Burden )。

3,wildcard。如:

Total = sum (of a:); 计算所有a开头的变量之和。


好像还有一些其他较复杂的用法,实在想不起来了。以后再补充吧。





55555.jpg (16.69 KB)

55555.jpg

已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
prince315 + 20 + 5 + 1 + 1 + 1 热心帮助其他会员
the_fly_winds + 5 + 1 精彩帖子
Strive、 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 20  论坛币 + 10  学术水平 + 3  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

藤椅
DriftKingHan 发表于 2016-12-3 20:24:41 |只看作者 |坛友微信交流群
区别在于
不加冒号(:)是formatted input,按informat的w读取指定列数的内容作为数据
加冒号(:)是modified list input,数据是以分隔符分隔的
你可以在源数据的b后面再加一个空格试试,这样的区别会更明显,有助于理解

使用道具

板凳
zkymath 在职认证  发表于 2016-12-3 22:00:19 |只看作者 |坛友微信交流群
:修饰提示符

使用道具

报纸
mich_ard 发表于 2016-12-4 09:34:45 |只看作者 |坛友微信交流群
才发现,google chrome会改变格式,firefox和IE 不会。举我上面的帖子为例,google chrome将两行(001和002)变成了一行,而且中间一些空格也不见了:

001 Christopher Mullens  11/12/1955 45,200002MichelleKwo 9/12/195578,123

不知大家发现没有?

使用道具

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

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

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

GMT+8, 2024-5-1 12:20