请选择 进入手机版 | 继续访问电脑版
楼主: woxuanwo
23243 11

[原创博文] 如何批量修改变量名 [推广有奖]

  • 0关注
  • 0粉丝

小学生

92%

还不是VIP/贵宾

-

威望
0
论坛币
990 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
58 点
帖子
8
精华
0
在线时间
9 小时
注册时间
2009-12-15
最后登录
2019-3-13

woxuanwo 发表于 2012-1-5 17:23:29 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教各位:如何在SAS中批量修改变量名,
例如:变量名分别为V1,V2,V3........V50这50个变量,如果需要将其RENAME为V1_N,V2_N,V3_N......V50_N,该如何操作呢?
因为有多个数据库,其变量的命名方式都是一样的,为了不至于合并的时候造成差错,因此,希望能通过RENAME来重命名,而且每个不同数据库新的变量名方式不同,可以识别是哪个数据库来的变量。
因为变量个数很多,所以不想一个个rename,不知道有没有简单的方法?
尝试用ARRAY,但是,由于变量类型不同(有的是字符型,有的是数字型,有的是日期型),所以好像不行。

恳请各位帮忙解答,非常感谢!
二维码

扫码加我 拉你入群

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

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

关键词:rename array 请各位帮忙 name 变量类型 命名方式 数据库 如何 而且

leptonyu 发表于 2012-1-5 19:17:35 |显示全部楼层 |坛友微信交流群
批量获取变量名,然后批量rename 使用宏变量来实现
1.get namelist
2. generate the rename code such as
proc datasets lib=lib;
modify table;
rename
%let i=1;
%let name=%scan(&namelist.,&i.);
  %do %while(%length(&name.));
     &name.=&name._N
%let i=%eval(&i+1);
%let name=%scan(&namelist.,&i.);
  %end;
;
quit;
已有 2 人评分经验 论坛币 收起 理由
eijuhz + 40 精彩帖子
admin_kefu + 25 热心帮助其他会员

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

使用道具

woxuanwo 发表于 2012-1-6 11:08:57 |显示全部楼层 |坛友微信交流群
leptonyu 发表于 2012-1-5 19:17
批量获取变量名,然后批量rename 使用宏变量来实现
1.get namelist
2. generate the rename code such as ...
非常感谢你的回复。但是,因为我SAS学的没那么深入,所以试了一下还是有些疑问。
我的数据保存在名a1的临时数据集中,变量名是V1-V50,那么,namelist是怎么获取的呢?
proc datasets lib=lib (这个是固定的表述么?)
modify table(这个table是特指某个数据集或文档么)
还有后面的&namelist,是不是第一步获取的文档或列表?

不好意思,因为学的不深但又想找点省事,所以问题这么多。我想着能直接套用,结果发现log窗口跳出来很多问题。

再次感谢!

使用道具

maidenhan 发表于 2012-1-6 21:16:37 |显示全部楼层 |坛友微信交流群
woxuanwo 发表于 2012-1-6 11:08
非常感谢你的回复。但是,因为我SAS学的没那么深入,所以试了一下还是有些疑问。
我的数据保存在名a1的临 ...
Try the contents procedure, and I provided an example here.

data test01;
        format id v1 8. v2 $10. v3 date9.;
        id = 1;
        v1 = 2;
        v2 = 'a';
        v3 = "01Jan2012"d;
run;
proc contents data = test01 out = test02(keep = name) noprint; run;
proc sql noprint;
        select compress(name||'='||name||'_n') into:renames separated by ' '
                from test02
                where lowcase(name) ne 'id';
quit;
data test03;
        set test01(rename=(&renames.));
run;
已有 2 人评分论坛币 收起 理由
eijuhz + 40 精彩帖子
admin_kefu + 25 热心帮助其他会员

总评分: 论坛币 + 65   查看全部评分

使用道具

leptonyu 发表于 2012-1-7 00:44:07 |显示全部楼层 |坛友微信交流群
你可以查询proc datasets的相关帮助 table是数据集名,lib=后面应该填逻辑库名
namelist需要获取,用proc sql 语句获取
楼上这位的代码也是不错,对于小数据集而言都一样

使用道具

☆Justforyou 发表于 2013-10-29 11:00:00 |显示全部楼层 |坛友微信交流群
楼上两位的代码都不错哈

使用道具

xiangjiafeng 发表于 2014-6-21 16:18:13 |显示全部楼层 |坛友微信交流群
学习了很多!好感激!

使用道具

great, it is very useful!

使用道具

jungsee 发表于 2016-1-12 19:56:55 |显示全部楼层 |坛友微信交流群
  1. data class;
  2.    set sashelp.class;
  3. run;

  4. data tmp;
  5.    if 0 then set sashelp.class(keep=age--weight);
  6. run;

  7. proc sql noprint;
  8.      select distinct strip(name)||"=Q1_"||strip(name)
  9.            into : rename separated by " "
  10.            from dictionary.columns
  11.            where libname="WORK" and memname="TMP";
  12. quit;


  13. proc datasets library=work;
  14. modify class;
  15.    rename &rename;
  16. run;
  17. quit;
复制代码
已有 2 人评分经验 论坛币 收起 理由
eijuhz + 20 精彩帖子
admin_kefu + 25 热心帮助其他会员

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

使用道具

jungsee 发表于 2016-1-12 20:12:42 |显示全部楼层 |坛友微信交流群
  1. /*********************************************/

  2. data test;
  3.         format id v1 8. v2 $10. v3 date9.;
  4.         id = 1;
  5.         v1 = 2;
  6.         v2 = 'a';
  7.         v3 = "01Jan2012"d;
  8. run;


  9. %MACRO renamall(libref, dataset, prefix);
  10.   %LOCAL namelist i ;
  11. PROC CONTENTS DATA=&libref..&dataset OUT=dumm9999;
  12. RUN;
  13. PROC SQL STIMER NOPRINT;
  14.   SELECT name
  15.     INTO :namelist SEPARATED BY ' '
  16.     FROM dumm9999
  17.   ;
  18. QUIT;
  19. PROC DATASETS NOLIST LIBRARY=&libref;
  20.   MODIFY &dataset;
  21.     RENAME
  22.   %LET i = 1;
  23.   %LET token = %SCAN(&namelist,&i);
  24.   %DO %WHILE(%LENGTH(&token));
  25.       &token = &token&prefix.
  26.     %LET i = %EVAL(&i + 1);
  27.     %LET token = %SCAN(&namelist,&i);
  28.   %END;
  29.     ;
  30.   RUN;
  31. QUIT;
  32. %MEND;

  33. %renamall(work,test,_N)



  34. data xx;
  35. a=1; b=2; c=3; d=4;
  36. proc sql noprint;
  37. select compress(name||"=M_"||name)  into : rnmlist separated by ' '
  38. from dictionary.columns
  39. where libname='WORK' and memname='XX'
  40. ;
  41. data xx;
  42.   set xx(rename=(&rnmlist));
  43. proc print;
  44. run;


  45. quit;
复制代码
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
eijuhz + 20 精彩帖子
凡尘梦1990 + 1 + 1 + 1 精彩帖子

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

使用道具

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

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

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

GMT+8, 2024-4-16 17:52