楼主: dxystata
4889 8

[原创博文] 如何将数值型转变为字符型? [推广有奖]

版主

已卖: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 发表于 2012-7-13 09:59:29 |AI写论文
100论坛币
data aaa;
label x="编号" z="值";
input z y$ x@@;
cards;
1 a 2
1 b 3
2 c 4
;
run;

要求产生的新数据集中变量名顺序不变,有label。变量均为字符型,程序最好能通用,谢谢!
关键词:数值型 字符型 label cards Input 通用 如何 程序 最好

本帖被以下文库推荐

沙发
YueweiLiu 发表于 2012-7-13 09:59:30
  1. proc format;
  2.         value sexfmt 1='男' 2='女';
  3. run;

  4. data aaa;
  5. label x="编号" z="值";
  6. format sex sexfmt.;
  7. format time mmddyy10.;
  8. input z y$ x sex time@@;
  9. cards;
  10. 1 a 2 1 2000
  11. 1 b 3 2 1000
  12. 2 c 4 1 3000
  13. ;
  14. run;

  15. %macro numtochar(libname=,dataset=,charlen=);

  16. options mvarsize=MAX;

  17. %let uclib=%upcase(&libname);
  18. %let ucds=%upcase(&dataset);

  19. proc sql noprint;
  20.         select         case
  21.                                 when format=" " then cats("__",name,"=strip(put(",name,",best.));")
  22.                                 else cats("__",name,"=strip(put(",name,",",format,"));")
  23.                         end,
  24.                         case
  25.                                 when label^=" " then cats("__",name,"='",label,"'")
  26.                                 else ""
  27.                         end,
  28.                         cats("__",name,"=",name,""),
  29.                         cats(name),
  30.                         cats("__",name)
  31.         into         :converts separated by " ",
  32.                         :labels separated by " ",
  33.                         :renames separated by " ",
  34.                         :drops separated by " ",
  35.                         :nnames separated by " "
  36.         from dictionary.columns where upcase(libname)="&uclib." and upcase(memname)="&ucds" and type="num";
  37.         select cats(name) into :names separated by " " from dictionary.columns where upcase(libname)="&uclib." and upcase(memname)="&ucds";
  38. quit;

  39. data want;
  40.         length &nnames. $ &charlen.;
  41.         set aaa;
  42.         &converts.;
  43.         label &labels.;
  44.         drop &drops.;
  45.         rename &renames.;
  46. run;

  47. data want;
  48.         retain &names.;
  49.         set want;
  50. run;
  51. %mend;

  52. %numtochar(libname=work,dataset=aaa,charlen=32)
复制代码

藤椅
chendonghui1987 发表于 2012-7-13 11:02:03
data work.bbb(drop = z y x
                        rename = (z1 = z y1 = y x1 = x));
        set work.aaa;
        label x1="编号" z1="值";
        z1 = put(z,8.);
        y1 = y;
        x1 = put(x,8.);
       
run;

板凳
YueweiLiu 发表于 2012-7-13 16:56:38
  1. %macro numtochar(libname=,dataset=,charlen=);

  2. options mvarsize=MAX;

  3. %let uclib=%upcase(&libname);
  4. %let ucds=%upcase(&dataset);

  5. proc sql noprint;
  6.         select         cats("__",name,"=strip(put(",name,",best.));"),
  7.                         cats("__",name,"='",label,"'"),
  8.                         cats("__",name,"=",name,""),
  9.                         cats(name),
  10.                         cats("__",name)
  11.         into         :converts separated by " ",
  12.                         :labels separated by " ",
  13.                         :renames separated by " ",
  14.                         :drops separated by " ",
  15.                         :nnames separated by " "
  16.         from dictionary.columns where upcase(libname)="&uclib." and upcase(memname)="&ucds" and type="num";
  17.         select cats(name) into :names separated by " " from dictionary.columns where upcase(libname)="&uclib." and upcase(memname)="&ucds";
  18. quit;

  19. data want;
  20.         length &nnames. $ &charlen.;
  21.         set aaa;
  22.         &converts.;
  23.         label &labels.;
  24.         drop &drops.;
  25.         rename &renames.;
  26. run;

  27. data want;
  28.         retain &names.;
  29.         set want;
  30. run;
  31. %mend;

  32. %numtochar(libname=work,dataset=aaa,charlen=32)
复制代码
本程序可将指定数据集中所有数值型变量,改为字符型变量,变量长度可以自行设置,保留标签及变量顺序如果数据集变量本身有变量以__开头,可能会有问题,因为程序里用到了这种变量,做修改即可。
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
pobel + 1 + 1 + 1 精彩帖子
dxystata + 20 + 1 + 1 我很赞同

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

报纸
dxystata 发表于 2012-7-13 17:39:20
谢谢YueweiLiu

proc format;
        value sexfmt 1='男' 2='女';
run;

data aaa;
label x="编号" z="值";
format sex sexfmt.;
format time mmddyy10.;
input z y$ x sex time@@;
cards;
1 a 2 1 2000
1 b 3 2 1000
2 c 4 1 3000
;
run;

补充两个要求,有format的数值型转成format格式的字符型变量,日期型数值变量转成mmddyy10.格式的字符型变量。

地板
YueweiLiu 发表于 2012-7-13 17:53:14
。。  先吃饭,回头给你看。。

7
pobel 在职认证  发表于 2012-7-13 22:12:32
proc format;
         value sexfmt 1='男' 2='女';
run;

data aaa;
label x="编号" z="值";
format sex sexfmt.;
format time mmddyy10.;
input z y$ x sex time@@;
cards;
1 a 2 1 2000
1 b 3 2 1000
2 c 4 1 3000
;
run;

data test;
     set sashelp.vcolumn;
         where libname="WORK" and memname="AAA";
         length code $100;
         if type="num" then do;
            if missing(format) then code=cat(strip(name),"=put(",strip(name)||"_1",",best.-l);");
                else   code=cat(strip(name),"=put(",strip(name)||"_1,",strip(format)||"-l);");
        end;
        else if type="char" then code= cat(strip(name),"=",strip(name)||"_1;");
run;

proc sql noprint;
    select strip(name),
           strip(name)||"="||quote(strip(label)||" "),
           strip(name)||"="||strip(name)||"_1" ,
                   strip(code)
    into : name separated by " ",
          : label separated by " ",
           : rename separated by " ",
                   : code separated by ""
      from test;
quit;


data transform;
    label &label;
    set aaa(rename=(&rename));
    &code
        keep &name;
run;
和谐拯救危机

8
YueweiLiu 发表于 2012-7-13 22:33:57
  1. case
  2.        when format=" " then cats("__",name,"=strip(put(",name,",best.));")
  3.        else cats("__",name,"=strip(put(",name,",",format,"));")
  4. end,
复制代码
主要改的这一句。

9
dxystata 发表于 2012-7-13 22:45:46
如有好的想法,继续奖励!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-6 08:04