楼主: mingyuqi
2762 8

[问答] 请教大神们,如何用PROC SQL实现Transpose的功能? [推广有奖]

  • 0关注
  • 0粉丝

大专生

50%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
3 点
热心指数
3 点
信用等级
3 点
经验
387 点
帖子
25
精华
0
在线时间
42 小时
注册时间
2016-1-17
最后登录
2023-8-13

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我有如图一所示的data set,每个specific observation measure里面都有十一个standard。目前data set的状态是每个standard的score占据一行,我希望把每个specific observation measure变成一行,每行包含十一个standard的score,如图二所示。请问是否可以通过PROC SQL实现这样的transpose呢?跪求大神指点,谢谢!

图一:
Untitled.png



图二:
Untitled2.png
Untitled3.png
二维码

扫码加我 拉你入群

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

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

关键词:Transpose proc sql Trans pose ans 如何

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

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

沙发
casper2 发表于 2016-3-30 09:51:34 |只看作者 |坛友微信交流群
这个代码可供参考:

data A;
    length player $4 itemtype $13;
    input region player $ itemtype $ itemcount itemamount;
    cards;
1 Jack ProOther      4  184
1 Jack ProOther      2   84
1 Jack ProGameCredit 4  100
1 Jack FnB           2  106
1 Jack FnB           1   86
1 Dick ProGameCredit 1 2310
1 Dick ProGameCredit 1  210
2 Mary ProOther      2   43
2 Jack FnB           1  522
3 Jack FnB           1   88
3 Jack ProGameCredit 3 1036
3 Mary FnB           1 4578
;
run;

%macro do_work;

    %local i next_name;

    %do i=1 %to %sysfunc(countw(&itlist));

        %let next_name = %scan(&itlist, &i);

        create table a_&next_name as
            select region, player,
                   sum(itemcount) as &next_name._itemcount,
                   sum(itemamount) as &next_name._itemamount
            from a
            where itemtype eq "&next_name"
            group by region, player, itemtype;

        create table t as
            select * from b left join a_&next_name
            on (b.region = a_&next_name..region and b.player eq a_&next_name..player);

        drop table b;

        create table b as select * from t;

        drop table t;

    %end;

%mend do_work;

proc sql;

select distinct itemtype into :itlist separated by ' ' from a order by itemtype;

create table b as select distinct region, player from a;

%do_work;

select * from b;

quit;


结果:

                                                  ProGame      ProGame
                          FnB_          FnB_      Credit_      Credit_    ProOther_    ProOther_
   region  player    itemcount    itemamount    itemcount   itemamount    itemcount   itemamount
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
        1  Dick              .             .            2         2520            .            .
        1  Jack              3           192            4          100            6          268
        2  Jack              1           522            .            .            .            .
        2  Mary              .             .            .            .            2           43
        3  Jack              1            88            3         1036            .            .
        3  Mary              1          4578            .            .            .            .
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
孤单的我们 + 5 + 3 + 3 + 3 精彩帖子
admin_kefu + 40 热心帮助其他会员

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

使用道具

藤椅
casper2 发表于 2016-3-30 10:01:02 |只看作者 |坛友微信交流群
SAS,R 交流互组微信群

wc_qrcode.png

使用道具

板凳
mingyuqi 在职认证  发表于 2016-3-30 22:50:39 |只看作者 |坛友微信交流群
THX! But do we really need to use macro in this case?

使用道具

报纸
dealbada 发表于 2016-3-31 06:35:01 |只看作者 |坛友微信交流群
这么简单,还是我没有get your point? 我没用proc sql, 在data step:

proc transpose data=data_in out=data_out(drop=_NAME_ _LABEL_) suffix=_score ;
by teacher_code obs_measure obs_specific date;
id std_code;
var score;
run;

使用道具

地板
smilealways193 发表于 2016-3-31 07:54:35 |只看作者 |坛友微信交流群
没用过transpose过程 原来那么方便

使用道具

7
casper2 发表于 2016-3-31 08:12:00 |只看作者 |坛友微信交流群
mingyuqi 发表于 2016-3-30 22:50
THX! But do we really need to use macro in this case?
No you don't have to. Macro is for the case that you don't know how many "standards" ahead of time. It's for a general purpose case.

使用道具

8
casper2 发表于 2016-3-31 08:14:14 |只看作者 |坛友微信交流群
smilealways193 发表于 2016-3-31 07:54
没用过transpose过程 原来那么方便
题目要求用SQL,用proc transpose谁都会。

使用道具

9
yongyitian 发表于 2016-3-31 08:36:48 |只看作者 |坛友微信交流群
  1. data Long;
  2.     Do ID = 1 to 3;
  3.       do j = 1 to 3;
  4.         Code = cats( 'D', j);
  5.        score = id + j;
  6.        output;
  7.     end; end;
  8.    drop j;
  9. run;

  10. proc sql;
  11. create table wide as
  12.    select distinct id,
  13.      sum(case when code = 'D1'  then score else 0 end)  as D1_score,
  14.       sum (case when code = 'D2' then score else 0 end)  as D2_score,
  15.        sum (case when code = 'D3' then score else 0 end)  as D3_score
  16.    from long
  17.    group by id;
  18. quit;
复制代码


MP777.JPG

使用道具

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

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

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

GMT+8, 2024-4-19 18:47