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

[问答] 如何获取某数值变量的实际数值长度 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.8528
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

Tigflanker 发表于 2013-10-20 11:38:50 |显示全部楼层 |坛友微信交流群
50论坛币
求助各位大神一个问题:

基本目标:想要获得某数值变量的实际长度。
例如:2.3   34.4   4   4.55   12.34  则按照最长的那个值12.34返回:4.2

打算用 retain + length + max 取得所有观测的最大长度;打算用 length - find . 获得小数位数。

遇到的困难是:length方法必须用在字符型变量,而若使用put方法转换时,需要指定转换格式。
而且又不希望直接用compress强行转化,会有强转提示,如此陷入困境。

请问各位,有无解法?谢谢。

  1. data in;
  2. input a b @@;
  3. cards;
  4. 2.3 3 3.4 4 13.2 2 2 2 23.33 4
  5. ;
  6. run;

  7. data out;set in;retain length 1;
  8.   length=max(length,length(compress(a,.)));   run;
复制代码

自己已写好,贡献出来,也许会有人要用:

  1. %Macro TF_JD(TF_JD_DS=,TF_JD_VAR=);
  2.   %let dsid=%sysfunc(open(&TF_JD_DS.));  
  3.   %let TF_JD_R=%sysfunc(vartype(&dsid,%sysfunc(varnum(&dsid,&TF_JD_VAR.))));
  4.   
  5.   data _NULL_;set &TF_JD_DS. end=last;
  6.     retain TF_JD_Temp111 0 TF_JD_Temp222 0;
  7.   
  8.     %if &TF_JD_R. eq C %then %do;
  9.       &TF_JD_VAR.1=input(&TF_JD_VAR.,best.);%end;
  10.     %else %do;&TF_JD_VAR.1=&TF_JD_VAR.;%end;
  11.   
  12.     TF_JD_Temp1=intz(&TF_JD_VAR.1);
  13.     TF_JD_Temp2=&TF_JD_VAR.1-TF_JD_Temp1;
  14.   
  15.     TF_JD_Temp11=length(strip(put(TF_JD_Temp1,best.)));
  16.     TF_JD_Temp22=length(strip(compress(put(TF_JD_Temp2,best.),'-')))-2;
  17.   
  18.     TF_JD_Temp111=max(TF_JD_Temp11,TF_JD_Temp111);
  19.     TF_JD_Temp222=max(TF_JD_Temp22,TF_JD_Temp222);
  20.   
  21.     if last then call symputx('TF_JD_R',
  22.             strip(put(TF_JD_Temp111+TF_JD_Temp222,best.))||'.'||strip(put(TF_JD_Temp222,best.)));
  23.   run;
  24. %Mend TF_JD;

  25. data b;
  26.   c='1.234';output;
  27.   c='-12.3';output;
  28.   c='1.3';output;
  29. run;

  30. %TF_JD(TF_JD_DS=b,TF_JD_VAR=c);
  31. %put >>>%sysevalf(&TF_JD_R.+1)<<<;
复制代码


关键词:数值变量 compress sysfunc length output 如何
Bye SAS.
若有缘,能重聚。
yongyitian 发表于 2013-10-20 11:38:51 |显示全部楼层 |坛友微信交流群
  1. data in;
  2. input a @@;
  3. cards;
  4. 2.3 3 311.4 4 13.2 2 2 2 23.33 4 1393.234
  5. ;
  6. run;

  7. data out;
  8.     set in;
  9.     retain  max_int max_dec max_len;
  10.       int_len = int(log10(a))+1;
  11.       dec_len = length(scan(a, 2, '.'));
  12.            LL = int_len + dec_len + 1;
  13.           fff = cats(LL, '.', dec_len);
  14.      if Int_len > max_int then max_int = int_len;
  15.      if dec_len > max_dec then max_dec = dec_len;
  16.           if LL > max_len then max_len = LL;
  17. run;
  18. proc print data=out; title 'out'; run;
复制代码

使用道具

Tigflanker 发表于 2013-10-20 13:21:17 |显示全部楼层 |坛友微信交流群
yongyitian 发表于 2013-10-20 12:39
感谢!!

scan(a, 2, '.')还有强转NOTE,不过int()给了我很大的提示,我记得还有一个取小数的方法。

采纳你了。
Bye SAS.
若有缘,能重聚。

使用道具

yeting2000 在职认证  发表于 2013-10-21 09:29:23 |显示全部楼层 |坛友微信交流群
看看

使用道具

yongyitian 发表于 2013-10-21 10:20:07 |显示全部楼层 |坛友微信交流群
Tigflanker 发表于 2013-10-20 13:21
感谢!!

scan(a, 2, '.')还有强转NOTE,不过int()给了我很大的提示,我记得还有一个取小数的方法。 ...
  1. data test;
  2.   input a;
  3.   do dec_len = 1 by 1 until(d<1.0E-12);
  4.    p= 10**dec_len;
  5.    d = a*p - int(a*p);
  6.   end;
  7.   put a=  dec_len=;
  8.   drop p d;
  9. datalines;
  10. 1.1
  11. 1.12
  12. 1.123
  13. 1.1234
  14. 1.12345
  15. 1.123456
  16. ;run;
复制代码

使用道具

hopewell 发表于 2013-10-21 10:38:21 |显示全部楼层 |坛友微信交流群
  1. data out;
  2.     retain _in _dn fmt;
  3.     if _n_=1 then do until(last);
  4.         set in end=last;
  5.         _re=prxparse('/(\d*)\.?(\d*)/');
  6.         if prxmatch(_re,strip(put(a,best32.))) then do;
  7.             call prxposn(_re,1,_p,_l1);
  8.             call prxposn(_re,2,_p,_l2);
  9.         end;
  10.         _in=max(_in,_l1);
  11.         _dn=max(_dn,_l2);
  12.         fmt=catx('.',sum(_in,_dn,1),_dn);
  13.     end;
  14.     set in;
  15.     drop _:;
  16. run;
复制代码
观钓颇逾垂钓趣 种花何问看花谁

使用道具

_i_ 发表于 2013-10-21 12:15:17 |显示全部楼层 |坛友微信交流群
结果怎么一个都看不懂

使用道具

mark8865 发表于 2015-7-6 14:39:18 |显示全部楼层 |坛友微信交流群
请问哪个函数可以直接读取数值型变量的长度啊?

使用道具

Tigflanker 发表于 2015-7-6 15:17:47 |显示全部楼层 |坛友微信交流群
mark8865 发表于 2015-7-6 14:39
请问哪个函数可以直接读取数值型变量的长度啊?
如果你指的是变量本身的长度,用vlength、vformat、vinformat即可

如果你指的是这个变量里的值,最大的是?.?(例如12.4),那可能没直接的方法。

使用道具

mark8865 发表于 2015-7-6 15:37:05 |显示全部楼层 |坛友微信交流群
Tigflanker 发表于 2015-7-6 15:17
如果你指的是变量本身的长度,用vlength、vformat、vinformat即可

如果你指的是这个变量里的值,最大的 ...
谢谢你的帮助,最近在弄数据,新手一枚,遇到好多问题。

使用道具

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

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

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

GMT+8, 2024-4-19 00:09