楼主: jungsee
2182 7

[问答] 数据排列结构的转换 [推广有奖]

  • 0关注
  • 10粉丝

讲师

30%

还不是VIP/贵宾

-

威望
0
论坛币
2102 个
通用积分
76.7787
学术水平
12 点
热心指数
15 点
信用等级
8 点
经验
73043 点
帖子
255
精华
0
在线时间
636 小时
注册时间
2004-12-20
最后登录
2023-12-27

50论坛币
我有个数据需要转换 结构但是自己编了一下,总是不能得到自己想要的结果,求大神指教!
具体的情况是:

1.原来的数据结构:

date ptvb1ri1mv1ptvb2ri2mv2ptvb3ri3mv3

1979-12-31

78.6

1630.38

124.28

1668.97

43.84

319.78

1980-1-31

0.3

76.63

1579.98

125.88

1678.95

0.31

44.19

322.3

1980-2-29

0.28

71.06

1454.56

122.73

1626.75

0.32

44.76

326.5

1980-3-31

0.25

65.51

1330.1

115.23

1515.1

0.29

40.85

297.96

1980-4-30

0.28

72.23

1454.72

126.81

1653.08

0.3

42.52

310.13

1980-5-30

0.27

70.5

1408.04

121.92

1575.92

0.31

43.76

316.84

1980-6-30

0.26

68.72

1361.4

132.51

1699.38

0.3

43.18

310.13

1980-7-31

0.29

76.45

1501.43

138.37

1760.2

0.31

44.7

318.1



2.我想要的结构:

我想得到的结构是:五列数据,上面的ptvb(ri  mv)后面的数字表示 公司的 代码(firm id),并且这个数字就顺序编码的,中间不会有中断 跳跃的 情况。


firm_Id      date             ptvb        ri         mv

1            1979-12-31      .           78.6    1630.38


省略其他时间的值


2          1979-12-31         .         124.28  1668.97  


请大神 下载 实验数据 test.xls,  转化为 CSV 后导入 SAS, 导入的程序也粘贴上了。
谢谢大神的指导。。。跪谢!!!!!!!!

  1. PROC IMPORT OUT=A
  2.             DATAFILE= "D:\test.csv"
  3.             DBMS=CSV REPLACE;
  4.     GETNAMES=YES;
  5. RUN;
复制代码




test.xls

95.5 KB

模拟数据

关键词:replace import place Names FIRM

回帖推荐

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

*easy question! i think . Try the following method; PROC IMPORT DATAFILE= "d:\test.xls" DBMS= xls REPLACE OUT=test; SHEET= test; GETNAMES=YES; GUESSINGROWs=32767; RUN; data test2; set test; array ptvb_a ptvb1-ptvb6; array ri_a ri1-ri6; array mv_a mv1-mv6; do firm_Id = 1 to 6; ptvb= ptvb_a[firm_Id]; ri= ri_a[firm_Id]; mv= mv_a[firm_Id]; output; ...
沙发
yongyitian 发表于 2014-7-13 21:31:34 |只看作者 |坛友微信交流群
  1. * in the imported dataset, only ID 1, 3, 6 are numeric data;
  2. * other IDs contain character variables, you need to change these to numeric data
  3. * The ID generated by the following code are not correct;

  4. data want;
  5.     set test;
  6.       array prm{3,3} ptvb1 ri1 mv1
  7.                   /* ptvb2 ri2 mv2 */
  8.                      ptvb3 ri3 mv3
  9.                   /* ptvb4 ri4 mv4 */
  10.                   /* ptvb5 ri5 mv5 */
  11.                      ptvb6 ri6 mv6;
  12.       do I = 1 to 3;
  13.          id = i;
  14.        ptvm = prm[i,1];
  15.          ri = prm[i,2];
  16.          mv = prm[i,3]; output;
  17.         end;
  18.     keep id date_ ptvm ri mv;
  19. run;
复制代码

使用道具

藤椅
zhanglianbo35 发表于 2014-7-14 00:23:20 |只看作者 |坛友微信交流群
*easy question! i think . Try the following method;

PROC IMPORT  DATAFILE= "d:\test.xls"  DBMS= xls REPLACE  OUT=test;
    SHEET= test;
    GETNAMES=YES;
    GUESSINGROWs=32767;
RUN;
data test2;
  set test;
  array ptvb_a ptvb1-ptvb6;
  array ri_a ri1-ri6;
  array mv_a mv1-mv6;
  do firm_Id = 1 to 6;
   ptvb= ptvb_a[firm_Id];
   ri= ri_a[firm_Id];
   mv= mv_a[firm_Id];
   output;
  end;
  keep firm_Id date ptvb ri mv;
run;
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
jungsee + 5 + 2 + 2 + 2 精彩帖子
admin_kefu + 10 热心帮助其他会员

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

使用道具

板凳
老师她摸我 发表于 2014-7-15 10:59:31 |只看作者 |坛友微信交流群
  1. data _null_;
  2.     set a(firstobs=1 obs=6) end=eot;
  3.     num=strip(put(_n_,best.));
  4.     if _n_=1 then call execute('data want(keep=firm_id date ptvb ri mv); length firm_id 8; set');
  5.     call execute('a(rename=(ptvb'||num||'=ptvb ri'||num||'=ri mv'||num||'=mv))');
  6.     if eot then call execute('; by date; firm_id=_n_ ; run;');
  7. run;
复制代码

使用道具

报纸
920240553 发表于 2014-7-15 16:12:02 |只看作者 |坛友微信交流群
我给你一个笨方法,不用数组就可以实现你的目的,而且易懂:
  1. proc import
  2.                         datafile = "C:\Documents and Settings\Administrator\桌面\test.xls"
  3.                         out = test
  4.                         dbms = xls replace;
  5.                 sheet = "test";
  6. run;
  7. %macro test(dataset = );
  8.         %let i = 1;
  9.         %do i = 1 %to 6 ;
  10.                 data &&dataset.&i.(label = no);
  11.                         set &dataset.(keep = DATE_AND_SETTINGS_ADMINISTRATOR_ PTVB&i. RI&i. MV&i.
  12.                                                 rename = (DATE_AND_SETTINGS_ADMINISTRATOR_ = date
  13.                                                         PTVB&i. = PTVB
  14.                                                         RI&i. = RI
  15.                                                         MV&i. = MV
  16.                                                         ));
  17.                         firm_id = &i.;
  18.                         i = i + 1;
  19.                         drop i;
  20.                 run;
  21.         %end;
  22. %mend;
  23. %test(dataset = test);

  24. data test_all(label = no);
  25. retain firm_id date ptvb ri mv ;
  26.         merge test1 test2 test3 test4 test5 test6 ;
  27.         by firm_id;
  28.         label ptvb = ptvb
  29.                   ri = ri
  30.                   mv = mv
  31.                   ;
  32. run;
复制代码


唯SAS之鼎也!

使用道具

地板
jungsee 发表于 2014-7-21 23:12:53 |只看作者 |坛友微信交流群
zhanglianbo35 发表于 2014-7-14 00:23
*easy question! i think . Try the following method;

PROC IMPORT  DATAFILE= "d:\test.xls"  DBMS= x ...
很好,谢谢大神

使用道具

7
jungsee 发表于 2014-7-21 23:13:39 |只看作者 |坛友微信交流群
920240553 发表于 2014-7-15 16:12
我给你一个笨方法,不用数组就可以实现你的目的,而且易懂:
这个方法也不错,谢谢您

使用道具

8
richycn 发表于 2014-7-22 10:11:35 |只看作者 |坛友微信交流群
论坛好多大神啊~

使用道具

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

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

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

GMT+8, 2024-4-28 17:51