全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
10050 5
2013-01-07
首先数据集:

复制代码


对上面的数据集做如下处理:

复制代码


运行结果:

obs            id       a   b  b1  c              d                   d1                e                    e1     f    f1
1       123456     12   6    1   6    123456                     7      123456                      7     6    1
2           5555     12   5    1   4            5555                 9              5555                  9     5    1
3             321     12   1    1   3                 321             10                 321              10     1    1
4                 1     12   1    1   1                         1         12                           1        12     1    1


a:    id字符串长度
b:    截取id的最后一个数字
b1:  查看b的长度,b的每条记录的长度都为1
c:    对id去掉空格后查看id的长度,123456为长度为6,  5555长度为4, 321长度为3,   1的长度为1  

到上面为止,跑出来的结果和预想中的是一样。

d:   对id截取id去掉空格后的长度,结果跑出来之后发现d的结果如上面所示。

一开始,我认为d是按实际储存的形式(长度为12)列了出来,可当我查看d的长度的时候,却发现并非这样,123456的长度居然是7,   5555按这样截取之后的长度居然是9.。。

突然我想是不是substr()函数的关系。。

再测试了一次

复制代码
结果:

obs   id          a         b          c
1    123456    6     123456
2        5555    5         5555
3          321    1           321
4              1    1               1

这里12刚好等于id的长度,所以截取出了id的最后一位;而3小于id的长度,结果把整个id都显示出来了;而c超过了id的长度,截取出来为空。

回到数据集test2, 这里的d=substr(id,length(compress(id,,'kd')));应该是length(compress(id,,'kd'))小于id的长度,所以全部截取出来。


可我的问题是,全部截取出来,d1应该全部都是12啊?为什么是那么奇怪的数字?
=============================

接下来,我又想是不是id本身有空格影响了截取本身。。。

所以我测试了e这个数据,使用了trim()去掉了id的空格,可结果跑出来依旧不对,长度也不对。。

问题:这里的trim()没起到作用,id的长度仍为原来的长度?


于是我想到了compress()压缩空格的方法,取了f,查看了f的长度,结果发现f和b是相同的,f1和b1是相同的,正是我想的结果。


compress()函数和trim()去空格的功能是不是在于id的长度是否变化?trim()函数使用后还是原来的变量,而compree(id,,'kd')相当于一个新变量,所以长度不同?


===========================================


我也不知道我说清楚了没有,大概问题就是上面这些。。。

二维码

扫码加我 拉你入群

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

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

全部回复
2013-1-7 18:26:02
原帖代码不知道为啥,显示不出来,我回复一个。。。问题在下面

=========================================


首先数据集:

data test1;
input id;
cards;
123456   
    5555      
       321
          1
;
run;


对上面的数据集做如下处理:

data test2;
set test1;
a=length(id);
b=substr(id,length(id));
b1=length(b);
c=length(compress(id,,'kd'));
d=substr(id,length(compress(id,,'kd')));
d1=length(d);
e=substr(trim(id),length(compress(id,,'kd')));
e1=length(e);
f=substr(compress(id,,'kd'),length(compress(id,,'kd')));
f1=length(f);
run;
proc print;
run;


运行结果:

obs            id       a   b  b1  c              d                   d1                e                    e1     f    f1
1       123456     12   6    1   6    123456                     7      123456                      7     6    1
2           5555     12   5    1   4            5555                 9              5555                  9     5    1
3             321     12   1    1   3                 321             10                 321              10     1    1
4                 1     12   1    1   1                         1         12                           1        12     1    1


a:    id字符串长度
b:    截取id的最后一个数字
b1:  查看b的长度,b的每条记录的长度都为1
c:    对id去掉空格后查看id的长度,123456为长度为6,  5555长度为4, 321长度为3,   1的长度为1  

到上面为止,跑出来的结果和预想中的是一样。

d:   对id截取id去掉空格后的长度,结果跑出来之后发现d的结果如上面所示。

一开始,我认为d是按实际储存的形式(长度为12)列了出来,可当我查看d的长度的时候,却发现并非这样,123456的长度居然是7,   5555按这样截取之后的长度居然是9.。。

突然我想是不是substr()函数的关系。。

再测试了一次

data test3;
set test1;
a=substr(id,12);
b=substr(id,3);
c=substr(id,13);
run;
结果:

obs   id          a         b          c
1    123456    6     123456
2        5555    5         5555
3          321    1           321
4              1    1               1

这里12刚好等于id的长度,所以截取出了id的最后一位;而3小于id的长度,结果把整个id都显示出来了;而c超过了id的长度,截取出来为空。

回到数据集test2, 这里的d=substr(id,length(compress(id,,'kd')));应该是length(compress(id,,'kd'))小于id的长度,所以全部截取出来。


可我的问题是,全部截取出来,d1应该全部都是12啊?为什么是那么奇怪的数字?
=============================

接下来,我又想是不是id本身有空格影响了截取本身。。。

所以我测试了e这个数据,使用了trim()去掉了id的空格,可结果跑出来依旧不对,长度也不对。。

问题:这里的trim()没起到作用,id的长度仍为原来的长度?


于是我想到了compress()压缩空格的方法,取了f,查看了f的长度,结果发现f和b是相同的,f1和b1是相同的,正是我想的结果。


compress()函数和trim()去空格的功能是不是在于id的长度是否变化?trim()函数使用后还是原来的变量,而compree(id,,'kd')相当于一个新变量,所以长度不同?


===========================================


我也不知道我说清楚了没有,大概问题就是上面这些。。。
二维码

扫码加我 拉你入群

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

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

2013-1-7 19:37:24
yzsxdlcc 发表于 2013-1-7 18:26
原帖代码不知道为啥,显示不出来,我回复一个。。。问题在下面

====================================== ...
1. 关于d的长度d1;
     d=substr(id,length(compress(id,,'kd')));
        d1=length(d);
首先,substr()函数要求的第一个参数是字符型,如果是数值型则会有数据类型的自动转换。
正如此例中,id为数值型,所以会自动转换成字符型,默认的格式是best12.
例如第一个id:123456,转换后就是“      123456”,前面六个空格。

再看substr()的第二个参数,为将id的值compress(即去掉空格)后的长度,显然为6,
因此就相当于d=substr(“      123456”,6);结果就是“ 123456”。

接下来,d1=length(" 123456"); d的长度自然就是7了。

(这里要注意的是数值型向字符型自动转换格式best12.,转换后会造成前面有空格)


2.关于trim()

trim()函数是将某个字符串后面的空格去掉(trailing space),不会去掉前面的空格(leading space)。
相对应的left()函数会去掉前面的空格。
strip()函数则可将前面和后面的空格都去掉。
二维码

扫码加我 拉你入群

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

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

2013-1-8 08:38:46
学习了,受教
请问楼上教授,数值型变量转换成字符型是不是$12.?best12.是不是数值型的格式?谢谢
二维码

扫码加我 拉你入群

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

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

2013-1-8 10:01:36
henryyhl 发表于 2013-1-8 08:38
学习了,受教
请问楼上教授,数值型变量转换成字符型是不是$12.?best12.是不是数值型的格式?谢谢
best12.是不是数值型的格式?

是。

测试一下
复制代码
----这个可以看出,字符型的数据abcde并没有录入

复制代码

----查看数据集也可以看出变量a的类型是数值型的。

====================
数值型变量转换成字符型是不是$12.?



测试:
复制代码
可以查看到数据集bb中的变量c为字符型变量且长度为12.
二维码

扫码加我 拉你入群

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

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

2013-1-8 10:07:25
pobel 发表于 2013-1-7 19:37
1. 关于d的长度d1;
     d=substr(id,length(compress(id,,'kd')));
        d1=length(d);
受教,是我对substr()函数的理解不够。

Substr(s,p,n)函数,其中s必须是字符型,这点我不清楚。同时,如果缺失n的话,SAS则会提取p后面全部字符,这里导致我计算d=substr(id,length(compress(id,,'kd')))的时候对d1=length(d)一直不能理解。

trim()函数我以为和oracle是一样的,去除所有空格。。汗。。

非常感谢。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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