3152 4

[问答] 不用PROC SQL来批量重命名变量 [推广有奖]

  • 0关注
  • 9粉丝

硕士生

51%

还不是VIP/贵宾

-

威望
0
论坛币
2206 个
通用积分
3.9706
学术水平
40 点
热心指数
42 点
信用等级
37 点
经验
967 点
帖子
78
精华
0
在线时间
252 小时
注册时间
2016-12-24
最后登录
2022-9-3

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
data set a1中有100个变量, a1x, a2x ...a100x
需要批量重命名为  b1x,b2x ...b100x

测试数据:
  1. data a1;
  2. a1x=1;
  3. a2x=2;
  4. a3x=3;
  5. a4x=5;
  6. a5x=123;
  7. a6x=1;
  8. a36x=1;
  9. a110x=1;
  10. run;
复制代码

我的做法:
  1. proc sql noprint;                                                                                                                       
  2.         select strip(name)||'=b'||substr(name,2)
  3.         into :rename_list separated by ' '
  4.         from dictionary.columns
  5.         where libname="WORK" and memname="A1" and name like 'a%';                                                                                                                 
  6. quit;
  7. proc datasets library=work nolist;                                                                                                      
  8.         modify a1;
  9.         rename &rename_list;                                                                                                                     
  10. quit;
复制代码

想请教一下各位大师有没有不用PROC SQL的做法? 有的话麻烦贴一下…让小弟可以学习一下 多谢


二维码

扫码加我 拉你入群

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

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

关键词:proc sql 批量重命名 sql ROC Dictionary

已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
williom25 + 5 + 3 + 3 + 3 精彩帖子

总评分: 论坛币 + 5  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

沙发
郑在花 在职认证  发表于 2017-7-1 04:52:50 |只看作者 |坛友微信交流群
不知道我理解你的意思对不对,是要把100个变量的名字从a变成b开头吗?
如果所有变量都是同一个data type,可以用array 和do loop rename 吧。

array old[*] a1x--a100x;
array new[*] b1x--b100x;
Do i=1 to 100;
rename old[i]=new[i];
end;
run;

类似于这样,不知道可不可行。 我也是新手,学习中。

使用道具

藤椅
popodan 在职认证  发表于 2017-7-1 11:48:58 |只看作者 |坛友微信交流群
如果变量名是有规律的,用楼上的array+do loop就可以rename,之后再drop掉旧的就好。
如果变量名没有规律,你又不想用proc sql,我有个笨办法就是转置用b替换a后再转置回去:
data b; /*提取变量名*/
set sashelp.vcolumn;
where libname="WORK" and memname="A1" and name like 'a%';
run;

data c(keep=name name2); /*创建新名*/
set b;
name2='b'||substr(name,2);
run;


proc transpose data=a1 out=a2 name=name;
run;
proc sort data=c;
by name;
proc sort data=a2;
by name;

data d (drop=name);
merge c a2;
by name;
run;

proc transpose data=d out=new_a1(drop=_name_);
ID name2;

run;
已有 1 人评分经验 论坛币 学术水平 热心指数 收起 理由
eijuhz + 20 + 20 + 1 + 3 热心帮助其他会员

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

使用道具

popodan 发表于 2017-7-1 11:48
如果变量名是有规律的,用楼上的array+do loop就可以rename,之后再drop掉旧的就好。
如果变量名没有规律, ...
多谢

原来dictionary.columns是几乎等价于sashelp.vcolumn的…
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
williom25 + 5 + 3 + 3 + 3 精彩帖子

总评分: 论坛币 + 5  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

使用道具

报纸
popodan 在职认证  发表于 2017-7-2 00:53:34 |只看作者 |坛友微信交流群
哈哈,刚发现有个好玩的做法可以批量替换前后缀的,不需要从dictionary或者sashelp里提取变量名,直接用varname函数来提取然后替换就好。
比如你这个题可以这样:
%macro
replaceprefix(lib,dsn,start,end,oldprefix,newprefix);
proc contents data=&lib..&dsn.;
title 'before renaming';
run;
data temp;
set &lib..&dsn.;
run;
%LET ds=%SYSFUNC(OPEN(temp,i));
%let ol=%length(&oldprefix.);
%do i=&start %to &end;
%let dsvn&i=%SYSFUNC(VARNAME(&ds,&i));
%let l=%length(&&dsvn&i);
%let vn&i=&newprefix.%SUBSTR(&&dsvn&i,&ol+1,%EVAL(&l-&ol));
%end;
data &lib..&dsn.;
set temp;
%do i=&start %to &end;
&&vn&i=&&dsvn&i;
drop &&dsvn&i;
%end;
%let rc=%SYSFUNC(CLOSE(&ds));
proc contents data=&lib..&dsn.;
title 'Replacing Prefix on Selected variables ';
run;
%mend replaceprefix;

%replaceprefix(WORK,a1,1,8,a,b);

使用道具

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

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

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

GMT+8, 2024-4-27 13:16