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

[问答] 【SAS求助】请问如何以符号为界拆分变量? [推广有奖]

  • 2关注
  • 0粉丝

本科生

8%

还不是VIP/贵宾

-

威望
0
论坛币
18 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
3705 点
帖子
21
精华
0
在线时间
116 小时
注册时间
2017-6-16
最后登录
2019-6-5

summerwe 发表于 2017-8-23 09:21:08 |显示全部楼层 |坛友微信交流群
1论坛币
现有如下数据集:
data a;
input x$;
cards;
lee-290-xyz
zhoujielun-2390-kkkk;
run;

想生成如下数据集:
x                y       z
lee             290    xyz
zhoujielun   2390  kkkk;


其中xyz为变量名,其余为观测,请问如何实现?非常感谢!!
关键词:SAS求助 Input cards 非常感谢 如何实现 SAS 问答 拆分变量
wwang111 发表于 2017-8-23 09:21:09 |显示全部楼层 |坛友微信交流群
  1. proc sql noprint;
  2. select max(count(x,'-')+1) into: n
  3. from a;
  4. quit;

  5. data wanted;
  6. set a;
  7. array var[&n] $20 a1-a%left(&n);
  8. do i=1 to dim(var);
  9.   var[i]=scan(x,i,'-');
  10. end;
  11. keep a:;
  12. run;
复制代码

已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

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

使用道具

summerwe 发表于 2017-8-23 10:15:10 |显示全部楼层 |坛友微信交流群
人工置顶

使用道具

popodan 在职认证  发表于 2017-8-23 11:31:20 |显示全部楼层 |坛友微信交流群
data b;
set a(rename=(x=xx));
x=scan(xx,1,'-');
y=scan(xx,2,'-');
z=scan(xx,3,'-');
drop xx;
run;
已有 1 人评分论坛币 收起 理由
admin_kefu + 10 热心帮助其他会员

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

使用道具

summerwe 发表于 2017-8-23 11:43:25 |显示全部楼层 |坛友微信交流群
wwang111 发表于 2017-8-23 11:31
data wanted;
set a;
array var[3] $20 a b c;
您好,感谢回复,我试了下,最后跑出来的结果是这样的:
a                 b          c
lee             290
zhoujiel
其中b只有一个值,c为空,而且zhoujielun的名字也不完全,只显示了zhoujiel。麻烦请再看下是什么情况

使用道具

summerwe 发表于 2017-8-23 11:44:10 |显示全部楼层 |坛友微信交流群
popodan 发表于 2017-8-23 11:31
data b;
set a(rename=(x=xx));
x=scan(xx,1,'-');
您好,感谢回复,我试了下,最后跑出来的结果是这样的:
a                 b          c
lee             290
zhoujiel
其中b只有一个值,c为空,而且zhoujielun的名字也不完全,只显示了zhoujiel。麻烦请再看下是什么情况

使用道具

wwang111 发表于 2017-8-23 11:48:29 |显示全部楼层 |坛友微信交流群
summerwe 发表于 2017-8-23 11:43
您好,感谢回复,我试了下,最后跑出来的结果是这样的:
a                 b          c
lee         ...
请查看一下你的数据集a是否完整,因为帖子里面你建立数据集a的代码是有问题的

使用道具

summerwe 发表于 2017-8-23 11:59:44 |显示全部楼层 |坛友微信交流群
wwang111 发表于 2017-8-23 11:48
请查看一下你的数据集a是否完整,因为帖子里面你建立数据集a的代码是有问题的
不好意思,是我搞错了,数据集a确实不完整,非常感谢,谢谢!!

使用道具

albusdzx 发表于 2017-8-23 12:18:55 |显示全部楼层 |坛友微信交流群
summerwe 发表于 2017-8-23 11:44
您好,感谢回复,我试了下,最后跑出来的结果是这样的:
a                 b          c
lee         ...
这个代码应该能跑出来 ,是不是读数据时没有设置 变量的长度
另外可以尝试用正则表达式解决:

data a;
length x $50;
input x $;
cards;
lee-290-xyz
zhoujielun-2390-kkkk
;

data test;
set a(rename=(x=x1));
pattern=prxparse('/(\D+)-(\d+)-(\D+)/');
if prxmatch(pattern,x1)>0 then do;
call prxposn(pattern,1,start1,length1);
call prxposn(pattern,2,start2,length2);
call prxposn(pattern,3,start3,length3);
x=substr(x1,start1,length1);
y=substr(x1,start2,length2);
z=substr(x1,start3);
end;
run;
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

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

使用道具

summerwe 发表于 2017-8-23 13:11:00 |显示全部楼层 |坛友微信交流群
albusdzx 发表于 2017-8-23 12:18
这个代码应该能跑出来 ,是不是读数据时没有设置 变量的长度
另外可以尝试用正则表达式解决:
是的,原数据集a不完整,感谢您的解答!!

使用道具

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

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

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

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