楼主: summerwe
3169 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 |AI写论文
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。麻烦请再看下是什么情况

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

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

9
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   查看全部评分

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

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

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