楼主: liyunq
7591 9

[原创博文] 新手问题:SAS变量类型的转换 [推广有奖]

  • 1关注
  • 0粉丝

初中生

85%

还不是VIP/贵宾

-

威望
0
论坛币
15 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
138 点
帖子
20
精华
0
在线时间
10 小时
注册时间
2010-8-27
最后登录
2013-1-29

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
data test;
a=200;
b='abc';
b=a;
run;
proc print data=test;
run;
结果a 和 b 都为200

data test;
a=200;
b='abc';
a=b;
run;
proc print data=test;
run;
结果a 是缺失值 b 为 'abc'

如何理解以上变量类型的转换?
二维码

扫码加我 拉你入群

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

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

关键词:变量类型 print Data test 如何理解 如何

回帖推荐

吕小布韦 发表于10楼  查看完整内容

正如京剧所说, 变量的类型一旦确定, 就不会再改变, log中提示的自动转换, 指的是变量的值在拿来用的时候类型变化了, 是值的类型变化了, 而不是变量本身的数据类型变化了. 比如b='200', a=b+b, 是原来字符型的'200'变为数字型的200, 而不是b由字符型变为数字型. 反过来比较好理解, 字符型变量的值, 能转成数字的, 就变成数字, 不能的就拉倒, 置为空值. 比如: data test; a='2e3'; b=a*1; run; a变成数字之后是2000, ...

本帖被以下文库推荐

沙发
jingju11 发表于 2012-10-10 10:22:02 |只看作者 |坛友微信交流群
我没有试。不过我想我说的应该是对的。我猜想在第一个数据里,b还是字符串-符合初定义,值为“200”-数字可以任意转化成字符串(b=a=200="200"),只是可能在log里留下类似转换的信息而已。在第二个问题里,‘abc’ 转化成数字时造成缺失。所以,一旦被定义,应该不存在类型的重新定义的问题。这里的“200”很可能些夹杂空格之类的。京剧

使用道具

藤椅
tekuaile 发表于 2012-10-10 10:39:30 |只看作者 |坛友微信交流群
jingju11 发表于 2012-10-10 10:22
我没有试。不过我想我说的应该是对的。我猜想在第一个数据里,b还是字符串-符合初定义,值为“200”-数字可 ...
data test;
a=200;
b='abc';
b=a;
c=a+b;
run;
proc print data=test;
run;

                                          The SAS System      10:19 , October 10, 2012

                                     Obs     a      b      c

                                      1     200    200    400

使用道具

板凳
jingju11 发表于 2012-10-10 10:43:52 |只看作者 |坛友微信交流群
am i wrong?
b is 3-letter long, character. c is numeric. the print cannot tell anything here. you can look at b's type

使用道具

报纸
pobel 在职认证  发表于 2012-10-10 10:57:34 |只看作者 |坛友微信交流群
jingju11 发表于 2012-10-10 10:43
am i wrong?
b is 3-letter long, character. c is numeric. the print cannot tell anything here. you c ...
You are right!

当数值赋值给字符型变量时,会发生自动类型转换,而且字符型变量的长度也会作为一个考虑因素,即SAS会尽可能准确的吧数值转化为字符的形式。

25   data test;
26   a=2020;
27   b='abc';
28   b=a;
29   c=a+b;
30   put a= b= c=;
31   run;

NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
      28:3
NOTE: Character values have been converted to numeric values at the places given by: (Line):(Column).
      29:5
a=2020 b=2E3 c=4020
NOTE: The data set WORK.TEST has 1 observations and 3 variables.
NOTE: DATA statement used (Total process time):
和谐拯救危机

使用道具

地板
tekuaile 发表于 2012-10-10 14:05:33 |只看作者 |坛友微信交流群
Ha ha, interesting.

251  data test;
252  a=2001;
253  b='200';
254  c=a+b;
255  d=a||b;
256  e=b+d;
257  put a= b= c= d= e= ;
258  b=a;
259  a=b;
260  c=a+b;
261  d=a||b;
262  e=b+d;
263  put a= b= c= d= e= ;
264  run;
NOTE: Character values have been converted to numeric values at the places given by:
      (Line):(Column).
      254:5   256:3   256:5   259:3   260:5   262:3   262:5
NOTE: Numeric values have been converted to character values at the places given by:
      (Line):(Column).
      255:3   258:3   261:3
a=2001 b=200 c=2201 d=2001200 e=2001400
a=2000 b=2E3 c=4000 d=20002E3 e=20004000
NOTE: Numeric values have been converted to character values at the places given by:
      (Line):(Column).
      215:3   218:3   220:3
a=1001 b=200 c=1201 d=1001200 e=1001400
a=1001 b=1E3 c=2001 d=10011E3 e=10012000

使用道具

7
liyunq 发表于 2012-10-13 02:50:36 |只看作者 |坛友微信交流群
真的很有意思,但还是有点乱,有哪位能总结一下呢?

使用道具

8
8112mmw 发表于 2015-11-26 14:22:30 |只看作者 |坛友微信交流群
是否可以这么理解:

当变量类型出现冲突的时候,变量类型的转换取决于运算符:
如为字符运算或者联系符(“||”),那么会将数值型转换成字符型,进行运算;
如为数值型运算符号(+、-等),那么会将字符型转换成数值型,进行运算;
如为“=”,则将等式右边的变量类型和值一起赋给左边。

使用道具

9
teqel 发表于 2015-11-27 00:44:14 |只看作者 |坛友微信交流群
这东西,可能知道就行了。真的工作中,要尽量避免默认的类型转换

使用道具

10
吕小布韦 发表于 2015-11-27 02:06:49 |只看作者 |坛友微信交流群
正如京剧所说, 变量的类型一旦确定, 就不会再改变, log中提示的自动转换, 指的是变量的值在拿来用的时候类型变化了, 是值的类型变化了, 而不是变量本身的数据类型变化了.
比如b='200', a=b+b, 是原来字符型的'200'变为数字型的200, 而不是b由字符型变为数字型.

反过来比较好理解, 字符型变量的值, 能转成数字的, 就变成数字, 不能的就拉倒, 置为空值. 比如:

data test;
a='2e3';
b=a*1;
run;

a变成数字之后是2000, 所以能够实现自动转换. 当然如果a='k'的话是无法自动转为13的.
并且自动转换一般都比较精确, 特别是数字转字符, 人为转的话还得left trim一下

至于tekuaile例子中提到的例子, 涉及到变量的length的概念: length指的是sas储存某个变量所用的byte数, 对于字符型变量, 1个byte正好对应一个字符位置, 对于数字型变量则不是, 字符型变量的length范围是3-8, 越高则储存的越精确. 这在值类型变换中体现的比较明显.

data test;
length a $4.;
b=10000;
a=b;
run;
如果是要用left trim来给a赋值, 那么是很难赋值准确的. 这时候自动转换就体现出了优势.

tekuaile提到的例子中第二个put的结果中e的结果很有意思:
  data test;
252  a=2001;
253  b='200';
254  c=a+b;        /*b的值读取之后变为数字200,*/
255  d=a||b; /*a和b的值分别变为各自的字符型*/
256  e=b+d;
257  put a= b= c= d= e= ;
258  b=a;/*a的值变为字符型2e3*/
259  a=b;/*由于b的length限制,a的值变为2000*/
260  c=a+b;
261  d=a||b;/*由于连接符,ab的值都变为字符型,d的值为'20002e3'*/
262  e=b+d;/*因为算数运算, bd的值变为数字型, d的值变为数字型对应20002000*/
263  put a= b= c= d= e= ;
264  run;


继续讨论:
225  data b;
226  a=300;
227  b='20';
228  c=a||b+b||a;
229  run;

NOTE: Character values have been converted to numeric values at the places given by: (Line):(Column).
      228:6   228:8
NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
      228:3    228:7    228:11

由以上例子可以看出SAS进行值自动转换的大概特点:
1, 不以最终值的类型判断是否如何进行转换, 而是以某个符号为根据. 比如228行中根据+判断应该转为数字型, 又
根据||判定应该转为字符型.
2, ||和+同时存在, +优先, 先根据+判断加号前后的需要转换为字符, 也就是228行的6,8两个位置
然后根据||前后判断, b+b作为整体应为字符型, 则指出+的位置代指b+b运算的结果.
3,

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

使用道具

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

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

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

GMT+8, 2024-5-1 13:48