楼主: 虞子期
1959 11

转置求助,谢谢 [推广有奖]

  • 16关注
  • 0粉丝

本科生

86%

还不是VIP/贵宾

-

威望
0
论坛币
25 个
通用积分
0
学术水平
2 点
热心指数
2 点
信用等级
3 点
经验
1770 点
帖子
58
精华
0
在线时间
102 小时
注册时间
2012-8-31
最后登录
2015-1-19

楼主
虞子期 发表于 2012-11-22 12:18:26 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
数据结果如下
data a;
input t m w s@@;
cards;
5.77 366.3 931 25
5.77 366.1 601 24
5.78 173.2 47 1
5.78 173.2 374 2
5.78 173.2 68 3
5.78 173.2 607 24
5.78 173.2 967 25
5.78 173.2 682 23
0.88  304   342  24
;
run;
想要把这样的数据转换成如下的数据形式
t         m         w        s1   s2   s3   s4   s5   s6   fred
5.77   366.3    931     a     a     a    a     p    a    1
5.77   366.1    601     a     a    a     p   a     a     1
5.78   173.2     47      p    a    a      a   a     a     6
5.78     173.2    374   a    p    a     a    a    a      6
5.78    173.2    68       a   a     p    a   a     a      6
5.78   173.2    607       a   a    a    p   a    a      6
5.78   173.2     967     a    a   a    a    p    a     6
5.78    173.2   682     a     a    a   a    a    p     6
0.88    304      342     a    a    a    p   a   a      1
其中s1=1 s2=2 s3=3 s4=24 s5=25 s6=23;若变量s=s1,则在s1下注字母p,同时在s2 s3 s4 s5 s6下注字母a。变量freq以变量t和m计算。
刚学程序,急着处理的实验数据,为了毕业,高手相助,感激不尽
二维码

扫码加我 拉你入群

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

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

关键词:Input cards 数据结果 数据转换 Data

回帖推荐

Imasasor 发表于4楼  查看完整内容

不用sort的改良版,可以不改变原数据的观测顺序

沙发
daxiaxj24 在职认证  发表于 2012-11-22 12:53:34
这是什么软件?
感谢此论坛!

藤椅
Imasasor 发表于 2012-11-22 12:59:02
  1. data b;
  2. set a;
  3. if s=1 then s1="p";
  4. else if s=2 then s2="p";
  5. else if s=3 then s3="p";
  6. else if s=24 then s4="p";
  7. else if s=25 then s5="p";
  8. else if s=23 then s6="p";
  9. array a(6) $ s1-s6;
  10. do i=1 to 6;
  11. if a(i)="" then a(i)="a";
  12. end;
  13. drop i;
  14. run;

  15. proc sql;
  16. create table c as select t,m,count(*) as freq from b
  17. group by t,m;
  18. quit;

  19. proc sort data=b;
  20. by t m;
  21. proc sort data=c;
  22. by t m;
  23. data d;
  24. merge b c;
  25. by t m;
  26. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
数据分析师3K + 2 + 3 + 5 观点有启发

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

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

板凳
Imasasor 发表于 2012-11-22 13:10:02
不用sort的改良版,可以不改变原数据的观测顺序
  1. data a;
  2. input t m w s@@;
  3. cards;
  4. 5.77 366.3 931 25
  5. 5.77 366.1 601 24
  6. 5.78 173.2 47 1
  7. 5.78 173.2 374 2
  8. 5.78 173.2 68 3
  9. 5.78 173.2 607 24
  10. 5.78 173.2 967 25
  11. 5.78 173.2 682 23
  12. 0.88  304   342  24
  13. ;
  14. run;

  15. data b;
  16. set a;
  17. if s=1 then s1="p";
  18. else if s=2 then s2="p";
  19. else if s=3 then s3="p";
  20. else if s=24 then s4="p";
  21. else if s=25 then s5="p";
  22. else if s=23 then s6="p";
  23. array a(6) $ s1-s6;
  24. do i=1 to 6;
  25. if a(i)="" then a(i)="a";
  26. end;
  27. drop i;
  28. run;

  29. proc sql;
  30. create table c as select t,m,count(*) as freq from b
  31. group by t,m;
  32. quit;

  33. proc sql;
  34. create table d as select b.*,c.freq from b,c
  35. where b.t=c.t and b.m=c.m;
  36. quit;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
数据分析师3K + 3 + 3 + 5 热心帮助其他会员

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

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

报纸
pobel 在职认证  发表于 2012-11-22 13:17:12
  1. data a;
  2. input t m w s@@;
  3. cards;
  4. 5.77 366.3 931 25
  5. 5.77 366.1 601 24
  6. 5.78 173.2 47 1
  7. 5.78 173.2 374 2
  8. 5.78 173.2 68 3
  9. 5.78 173.2 607 24
  10. 5.78 173.2 967 25
  11. 5.78 173.2 682 23
  12. 0.88  304   342  24
  13. ;
  14. run;

  15. *** Count Frequence and prepare for s1-s6;
  16. proc sql;
  17. create table b as
  18.    select monotonic()as _n_,*, count(*) as freq
  19.           , case s
  20.                      when 1 then "s1"
  21.                          when 2 then "s2"
  22.                          when 3 then "s3"
  23.                          when 24 then "s4"
  24.                          when 25 then "s5"
  25.                          when 23 then "s6"
  26.                          else " "
  27.                         end as _Name_
  28.                   ,"p" as value
  29.         from a
  30.         group by t,m
  31.         order by _n_;
  32. quit;

  33. *** Transpose to get variable s1-s6;
  34. proc transpose data=b out=c(drop=_:);
  35.    by _n_ t m w s freq notsorted;
  36.    var value;
  37. run;

  38. *** replace missing values with "a";
  39. data d;
  40.    set c;
  41.    array tmp(6) $ s1-s6;
  42.    do _n_=1 to dim(tmp);
  43.      if missing(tmp(_n_)) then tmp(_n_)="a";
  44.         end;
  45. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
数据分析师3K + 20 + 3 + 3 + 3 热心帮助其他会员

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

和谐拯救危机

地板
ziyenano 发表于 2012-11-22 13:20:54
proc sql;
create table b as
select t,m,w,
ifc(s=1,'p','a') as s1 length=1,
ifc(s=2,'p','a') as s2 length=1,
ifc(s=3,'p','a') as s3 length=1,
ifc(s=24,'p','a') as s4 length=1,
ifc(s=25,'p','a') as s5 length=1,
ifc(s=23,'p','a') as s6 length=1,
count(1) as freq
from a group by t,m;
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
pobel + 1 + 1 + 1 精彩帖子
数据分析师3K + 60 + 80 + 3 + 3 + 5 热心帮助其他会员

总评分: 经验 + 60  论坛币 + 80  学术水平 + 4  热心指数 + 4  信用等级 + 6   查看全部评分

7
虞子期 发表于 2012-11-22 14:22:49
谢谢,大家的帮助

8
虞子期 发表于 2012-11-22 14:37:56
由于本人数据太多,例子中只写的一部分,当变量S=s1,s2,s3,s4, s5,s6,..........sn时该怎么编写程序呢?

9
pobel 在职认证  发表于 2012-11-22 15:11:39
虞子期 发表于 2012-11-22 14:37
由于本人数据太多,例子中只写的一部分,当变量S=s1,s2,s3,s4, s5,s6,..........sn时该怎么编写程序呢?
根据需要改变“data s”那一步就可以了。
  1. data a;
  2. input t m w s@@;
  3. cards;
  4. 5.77 366.3 931 25
  5. 5.77 366.1 601 24
  6. 5.78 173.2 47 1
  7. 5.78 173.2 374 2
  8. 5.78 173.2 68 3
  9. 5.78 173.2 607 111
  10. 5.78 173.2 967 25
  11. 5.78 173.2 682 23
  12. 0.88  304   342  89
  13. ;
  14. run;

  15. *** Rule for S variables;
  16. data s;
  17.    input sval svar $;
  18.    call symputx("S_num",_n_);
  19.    cards;
  20. 1 s1
  21. 2 s2
  22. 3 s3
  23. 24 s4
  24. 25 s5
  25. 23 s6
  26. 111 s7
  27. 89 s8
  28. ;

  29. *** Count Frequence and prepare for s1-s6;
  30. proc sql;
  31. create table b as
  32.    select *, count(*) as freq
  33.           , svar as  _Name_
  34.                   ,"p" as value
  35.         from a left join s
  36.         on a.s=s.sval
  37.         group by t,m;
  38. quit;

  39. *** Transpose to get variable s1-s6;
  40. proc transpose data=b out=c(drop=_:);
  41.    by t m w s freq notsorted;
  42.    var value;
  43. run;

  44. *** replace missing values with "a";
  45. data d;
  46.    set c;
  47.    array tmp(&s_num) $ s1-s&s_num;
  48.    do _n_=1 to dim(tmp);
  49.      if missing(tmp(_n_)) then tmp(_n_)="a";
  50.         end;
  51. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
davil2000 + 3 + 3 + 3 精彩帖子

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

和谐拯救危机

10
ziyenano 发表于 2012-11-22 15:12:05
proc sql noprint ;
select count(distinct s) into:count  from a;
select distinct s into :s1-:s%sysfunc(compress(&count)) from a order by s;
/*这里设置S1为最小,Sn最大*/
quit;

%macro ifc;
%do i=1 %to &count;
ifc(s=&&s&i,'p','a') as s&i length=1,
%end;
%mend;


proc sql;
create table b as
select t,m,w,
%ifc
count(1) as freq
from a group by t,m;
quit;
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
davil2000 + 3 + 3 + 3 热心帮助其他会员
pobel + 1 + 1 + 1 精彩帖子

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

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

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