楼主: playmore
1721 9

如何对下表进行重组得到新的变量 [推广有奖]

已卖:1645份资源

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16356 个
通用积分
8.6697
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1332 小时
注册时间
2007-1-11
最后登录
2025-12-1

初级学术勋章 初级热心勋章 中级热心勋章

楼主
playmore 发表于 2012-12-12 14:04:33 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
如下所示的数据集

  1. data have;
  2. input ByFactors $ Name $ MEAN STD;
  3. datalines;
  4. 2009 A 23 41
  5. 2009 B 45 37
  6. 2010 A 27 53
  7. 2010 B 12 90
  8. ;
  9. run;
复制代码

想要得到的新的数据集中变量设置如下:

ByFactors Mean_A Mean_B Std_A Std_B

有没有不借助中间表格(如把A和B拆分成两个表格后再用SQL连接),而直接一个sql步或data步完成的办法?谢谢!

二维码

扫码加我 拉你入群

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

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

关键词:factors factor Facto Lines Input 重组 如何

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

沙发
pobel 在职认证  发表于 2012-12-12 14:36:24
data have;
input ByFactors $ Name $ MEAN STD;
datalines;
2009 A 23 41
2009 B 45 37
2010 A 27 53
2010 B 12 90
;
run;


data want;
   merge have(where=(name="A") rename=(mean=mean_a std=std_a))
         have(where=(name="B") rename=(mean=mean_B std=std_B));
   by byfactors;
run;
和谐拯救危机

藤椅
pobel 在职认证  发表于 2012-12-12 14:41:57
data have;
input ByFactors $ Name $ MEAN STD;
datalines;
2009 A 23 41
2009 B 45 37
2010 A 27 53
2010 B 12 90
2011 A 20 18
2012 B 18 23
;
run;


proc sql;
   create table want as
    select coalesce(a.byfactors,b.byfactors),a.mean as mean_a, a.std as std_a
                                            ,b.mean as mean_b, b.std as std_b
         from (select * from have where name="A") as a
            full join
                   (select * from have where name="B") as b
         on a.byfactors=b.byfactors;
quit;
和谐拯救危机

板凳
ziyenano 发表于 2012-12-12 14:47:22
要不要考虑分组并不止A,B两组的情况?

报纸
playmore 发表于 2012-12-12 15:56:22
pobel 发表于 2012-12-12 14:41
data have;
input ByFactors $ Name $ MEAN STD;
datalines;
多谢,学习了coalesce的用法
您的方法受限于Name的数量
如果Name的数量比较大的话
笛卡尔积可能会很大
不知道这种没有生成实际的表格而仅是在from子句中出现的笛卡尔积效率如何
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

地板
playmore 发表于 2012-12-12 15:57:45
ziyenano 发表于 2012-12-12 14:47
要不要考虑分组并不止A,B两组的情况?
需要考虑
因为我想写个宏,用于处理各式的表格
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

7
ziyenano 发表于 2012-12-12 16:04:03
playmore 发表于 2012-12-12 15:57
需要考虑
因为我想写个宏,用于处理各式的表格
proc transpose倒是不用考虑name的数量,
只不过不能一步写成~

8
bjtoronto 发表于 2013-3-7 01:00:08
playmore 发表于 2012-12-12 15:57
需要考虑
因为我想写个宏,用于处理各式的表格
Hi Playmore,
I know the posting is back to last year. However I try to create a macro as an exercise.
If you have time, please go through it, and let me know any concerns. Thanks in advance.

data have;
input ByFactors $ Name $ MEAN STD;
datalines;
2009 A 23 41
2009 B 45 37
2010 A 27 53
2010 B 12 90
2012 C 23 35
2012 D 12 23
2011 A 23 45
;
run;

%MACRO createwant;
/*get the name with no duplicate*/
proc sort data=have out=have1 (keep=name) nodupkey;
by name;
run;

/*put all the name into a string*/
data _null_;
set have1 end=last;
length test $200;
retain test;
test=catx(' ',test,name);
if last then call symputx('mytest',test);
run;

/*Create the final dataset*/
data want;
%let i=1;
    merge
       %do %until(not %length(%scan(&mytest,&i)));
           have(where=(name="%scan(&mytest,&i)") rename=(mean=mean_%scan(&mytest,&i) std=std_%scan(&mytest,&i)))
           %let i=%eval(&i+1);
       %end;
    ;
    by byfactors;
    drop name;
run;

/*Delete the temp sataset*/
proc datasets library=work;
delete have1;
run;

quit;
%MEND createwant;

%createwant

9
playmore 发表于 2013-3-7 08:51:56
bjtoronto 发表于 2013-3-7 01:00
Hi Playmore,
I know the posting is back to last year. However I try to create a macro as an exerc ...
多谢你的宏,作为范例写得很好啊

另外提一下,得到数据集的变量名称,用proc contents或者用SASHELP.VCOLUMN表都可以

还有当时我提这个问题是我需要处理这种不太符合数据库规范的表,
如果这个表包含如下变量就不用这么处理了
date variable statistic value
也就是在SAS中用proc means得到表
这种表处理起来就方便多了

还是谢谢你的回复,呵呵
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

10
jolterheadmmtt 发表于 2013-7-31 17:43:46
最最mark!!!

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

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