楼主: firstknife
8297 19

关于SAS分列,请高手支招儿 [推广有奖]

  • 0关注
  • 2粉丝

教授

34%

还不是VIP/贵宾

-

威望
0
论坛币
22014 个
通用积分
112.4724
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
213888 点
帖子
575
精华
0
在线时间
2113 小时
注册时间
2006-12-30
最后登录
2026-1-7

楼主
firstknife 发表于 2011-5-10 17:58:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
假设变量a是几种产品的组合,产品名之间以+号连接,如下
变量a
a+b
ab+c+d
a+dec+bdfs+j
k
现在的问题是想分列,每个产品自成一列,变成如下形式
变量a1  变量a2  变量a3  变量a4
a            b
ab          c             d
a            dec         bdfs       j
k
请问有没有快捷的SAS程序来实现啊?
有请各位高手支招儿,先行谢过!
二维码

扫码加我 拉你入群

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

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

关键词:支招儿 请问有没有 sas程序 Dec dfs 高手 SAS 支招儿 分列

回帖推荐

sas_user 发表于3楼  查看完整内容

data b; infile datalines dsd dlm='+' missover; input (a1 a2 a3 a4) ($); datalines; a+b ab+c+d a+dec+bdfs+j k ; run;

本帖被以下文库推荐

沙发
leedx 发表于 2011-5-10 18:15:59
其实你在excel里面弄,还来的快一点~

分列.jpg (40.17 KB)

分列.jpg

已有 2 人评分经验 学术水平 热心指数 收起 理由
李会超 + 20 精彩帖子
firstknife + 1 + 1 鼓励积极发帖讨论

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

藤椅
sas_user 发表于 2011-5-10 19:05:34
data b;
infile datalines dsd dlm='+' missover;
input (a1 a2 a3 a4) ($);
datalines;
a+b
ab+c+d
a+dec+bdfs+j
k
;
run;
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
李会超 + 40 精彩帖子
firstknife + 1 + 1 + 1 好的意见建议

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

板凳
readhistory 发表于 2011-5-10 20:44:02
要是这4个观测就好办了。如果是不可预知分为多少列的情况呢?

报纸
456852 发表于 2011-5-10 22:39:15
首先,你可以用count函数算出a变量里每个值有多少个+,然后取最大的为一个宏变量。然后,用类似
%do i=1 %to &n;
new&i=scan(a,&i,'+');
%end;
的code来生成。
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
李会超 + 60 精彩帖子
firstknife + 1 + 1 + 1 观点有启发

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

地板
sas_user 发表于 2011-5-10 23:22:54
如果不是sas data set, 就可以选择最长的一个obs做小样本,import 到SAS,sas 会自动设置宽度。成为sas data set 之后就可以象楼上所说的操作了。

7
firstknife 发表于 2011-5-11 09:41:23
2# leedx
非常谢谢!
excel确实很方便,只是excel有观测记录最大值的限制,有些时候必须用sas之类的专业统计软件来解决

8
firstknife 发表于 2011-5-11 09:43:41
3# sas_user
非常感谢!
弱弱地再问一下,如果上述过程不是发生在最初读数据的时候,而是已经有了一个现成的数据库,其中有变量a,现在要把a拆成a1-a4怎么办?

9
zhaoping603 发表于 2011-5-11 11:26:39
8# firstknife

根据以上高手的思路,我写的完整的,思路还是最重要的哦。我也学习了。
data aa;
input a$20.;
cards;
a+b
ab+c+d
a+dec+bdfs+j
k
;
run;
proc sql;
select max(count(a,'+'))+1 into:num /*count(string,substring)数:子串在原字符串中出现的次数*/
from aa;                           /*num用来记录分列之后的具体列数*/
/*method one*/
%macro group(n);
data out;
set aa;
%do i=1 %to &n;
new&i=scan(a,&i,'+');
%end;
run;
%mend;
%group(&num);
/*method two*/
data out(drop=i);
set aa;
array new(&num)$;
do i=1 to #
  new(i)=scan(a,i,'+');
end;
run;
已有 4 人评分经验 学术水平 热心指数 信用等级 收起 理由
李会超 + 80 + 2 精彩帖子
碧幽攸 + 1 + 1 学习了,学习~~
firstknife + 1 + 1 + 1 好的意见建议
soporaeternus + 1 + 1 + 1 我很赞同

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

10
leedx 发表于 2011-5-11 11:29:47
学习了,厉害~

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

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