楼主: dxystata
3290 14

如何使数据集中变量保留最大长度。 [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2013-12-15 10:34:11 |AI写论文
50论坛币
  1. data a;
  2. length x $20. y$20.;
  3. input x$ y$;
  4. cards;
  5. a b
  6. aaa bbbbbbbbbbbbbbbbbb
  7. ;
  8. run;
复制代码
如何使数据集保留字符变量的最长长度?比如: x的长度为3,y的长度为18.
数据集很多,如何批量实现?谢谢!

关键词:数据集 length Input cards 字符变量 如何

本帖被以下文库推荐

沙发
Eternal0601 发表于 2013-12-15 12:16:44
/*just for reference*/
data a;
length x $20. y$20.;
input x$ y$;
cards;
a b
aaa bbbbbbbbbbbbbbbbbb
;
run;

%macro maxlen(lib=,mem=,out=);
proc sql noprint;
        select name into: varlist separated by ' '
        from dictionary.columns
        where libname=%upcase("&lib.") and memname=%upcase("&mem.");
quit;

%let nvar=%sysfunc(countw(&varList));

%let varlast=%scan(&varList, &nvar.);

proc sql;
        create table &out. as
        select
                 %do i =1 %to %eval(&nvar.-1);
                             %let var =%scan(&varList, &i);
                                        max(length(&var.)) as &var.len,
                 %end;

          max(length(&varlast.)) as  &varlast.len
        from a;
quit;
%mend maxlen;

%maxlen(lib=work,mem=a,out=test)
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
dxystata + 20 + 1 + 1 鼓励积极发帖讨论
webgu + 60 + 15 + 1 + 1 + 1 不错的。

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

藤椅
dxystata 发表于 2013-12-15 12:39:45
Eternal0601 发表于 2013-12-15 12:16
/*just for reference*/
data a;
length x $20. y$20.;
你误会我的意思啦,我希望得到的数据集变量x的长度为3,y的变量长度为18。
proc contents data=a;
run;
                                 #    变量    类型    长度

                                    1    x       字符      3
                                    2    y       字符      18

板凳
Eternal0601 发表于 2013-12-15 12:47:50
dxystata 发表于 2013-12-15 12:39
你误会我的意思啦,我希望得到的数据集变量x的长度为3,y的变量长度为18。
proc contents data=a;
run; ...
哈哈,感觉直接在data-input-cards中实现不了,但可以先定义一个大长度,然后再改属性

报纸
dxystata 发表于 2013-12-16 10:29:54
继续求助!

地板
yongyitian 发表于 2013-12-16 10:47:49
  1. data a;
  2. length x $20. y$20.;
  3. input x$ y$;
  4. cards;
  5. a b
  6. aaa bbbbbbbbbbbbbbbbbb
  7. ; run;

  8. data _null_;
  9.     set a;
  10.    retain x_length y_length 0;
  11.    if length(x) > x_length then x_length = length(x);  
  12.       call symput('x_length', x_length);
  13.    if length(y) > y_length then y_length = length(y);  
  14.       call symput('y_length', y_length);
  15. run;

  16. data a;
  17.    length x $&x_length y $&y_length;
  18.    set a;
  19. run;
  20. proc contents data=a; run;
复制代码
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 60 + 20 + 1 + 1 + 1 精彩帖子

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

7
farmman60 发表于 2013-12-17 10:23:27

proc sql;
  select count(name) into: num from (select name,type from dictionary.columns where libname='WORK' and memname='A') where type='char';
  quit;

data _null_;
  set A end=last;
  array var _character_;
  array var_length(&num) $;
  array _var(&num) $;
  retain var_length:;
  length varlist $50;
do i=1 to #
  if length(var(i))>var_length(i) then var_length(i)=length(var(i));
end;
if last then do;
  do i=1 to #
    _var(i)=vname(var(i))||' $'||trim(left(var_length(i)));

        varlist=catx(' ', varlist,_var(i));
  end;
call symput('length_change',varlist);
end;
run;

data a;
  length &length_change;
  set a;
  run;

8
zhengbo8 发表于 2013-12-17 20:09:39
大家的方法太复杂了。
  1. data a;
  2.        
  3.         infile datalines pad _infile_=rec;
  4.         input x $ : @;
  5.         y=substr(rec,length(x)+2);

  6.     /* xlength=length(x);  */
  7.     /* ylength=length(y) ; */

  8. datalines;
  9. a b
  10. aaa bbbbbbbbbbbbbbbbbb
  11. ;
复制代码
求币。

9
dxystata 发表于 2013-12-19 06:20:09
zhengbo8 发表于 2013-12-17 20:09
大家的方法太复杂了。求币。
没达到要求啊!

10
dxystata 发表于 2013-12-19 06:21:06
yongyitian 发表于 2013-12-16 10:47
变量很多时,就不适用啦!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 14:55