楼主: pingguzh
4986 9

求教带日期型数据集排序的问题 [推广有奖]

  • 0关注
  • 4粉丝

菜鸟

副教授

48%

还不是VIP/贵宾

-

威望
0
论坛币
3 个
通用积分
20.1546
学术水平
1 点
热心指数
7 点
信用等级
3 点
经验
20017 点
帖子
870
精华
0
在线时间
433 小时
注册时间
2012-10-29
最后登录
2024-1-28

楼主
pingguzh 发表于 2012-11-28 10:29:56 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
前几天遇到了一个数据集排序的问题,也得到了高手们的细心指点,非常感谢
现在又遇到了另外一个相似的问题
假设数据集为4个变量,第一个变量为日期型的
date xys xjz xmsy
04SEP2012 -1.5655132113       1.135456454987       0.8554656132131
04OCT2012 -3.54654897465    0.3534435219          1.56321321313546
04DEC2012 -2.213546698        1.165463561654        .
希望能够在每一个日期下,对各变量的取值大小进行降序排序,都输出到同一个数据集a
另外,还需要生成一个数据集b,用于保存排序之后的各变量名,请问应该怎么操作呢?感觉比较复杂这个
比如a数据集里面的04SEP2012 这一行,对应的数据是04SEP2012  1.135456454987  0.8554656132131    -1.5655132113
比如b数据集里面的04SEP2012 这一行,排序之后xjz对应的数值最大,那么b数据集里面的04SEP2012这一行对应的数据是04SEP2012   xjz    xmsy   xys
谢谢,请高手指点程序应该怎么写呢


二维码

扫码加我 拉你入群

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

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

关键词:日期型 数据集 非常感谢 怎么操作 高手指点

回帖推荐

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

data test; input date : date9. xys xjz xms; format date date9.; cards; 04SEP2012 -1.5655132113 1.135456454987 0.8554656132131 04OCT2012 -3.54654897465 0.3534435219 1.56321321313546 04DEC2012 -2.213546698 1.165463561654 . ; data a(keep= date value:) b(keep=date var:) c; set test; array _have (3) xys xjz xms; array _sorted (3) value1-val ...

本帖被以下文库推荐

统计爱好

沙发
pingguzh 发表于 2012-11-28 10:50:57
结合之前高手们的指点,我考虑可能需要如下步骤
首先对数据集里面的各行的数据进行排序,得到数据集a
然后生成字符串数组{m},将数字和对应的变量名字结合在一起,用到连接函数,比如cats或者||
然后会用到call sortc进行字符串的排序
然后用截取函数,将变量名从数组中截取出来,可能用到substr函数,最后得到数据集b
不知道上述方法对不对,可是我不知道应该怎么去编程,自己编程的程序老是出错

我这个情况是第一个变量是日期,和后面几个变量的格式不同,不能针对全数据集进行数组操作以及截取操作
统计爱好

藤椅
pobel 在职认证  发表于 2012-11-28 10:59:21
data test;
input date : date9. xys xjz xms;
format date date9.;
cards;
04SEP2012 -1.5655132113       1.135456454987       0.8554656132131
04OCT2012 -3.54654897465    0.3534435219          1.56321321313546
04DEC2012 -2.213546698        1.165463561654        .
;


data a(keep= date value:) b(keep=date var:) c;
   set test;
   array _have (3) xys xjz xms;
   array _sorted (3) value1-value3;
   array _name (3) $ var1-var3;

   *** Sort values;
   do i=1 to dim(_have);
      _sorted(i)=_have(i);
   end;
   call sortn(value3,value2,value1);

   *** Get variable names;
   do i=1 to dim(_sorted);
      do j=1 to dim(_Have);
              if _have(j)=_sorted(i) then _name(i)=vname(_have(j));
          end;
   end;
run;
   
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
bakoll + 3 + 3 精彩帖子
Imasasor + 36 + 60 + 1 + 1 + 1 分析的有道理
pingguzh + 1 热心帮助其他会员

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

和谐拯救危机

板凳
pingguzh 发表于 2012-11-28 11:45:27
谢谢,请问程序中的array _have (3) xys xjz xms; 能否用array _have (3)  xms-xys这个句子代替?或者是xys-xms代替?
call sortn(value3,value2,value1);能否写为call sortn(value3-value1);
若是必须写出每个变量名和value的名字,那么当变量名较大,比如10000个时,这个程序好像就不简洁了
统计爱好

报纸
bobguy 发表于 2012-11-28 12:12:05
Here is a generic way to handle it. It does not require any assumptions about the data structures.

data test;
input date : date9. xys xjz xms;
format date date9.;
cards;
04SEP2012 -1.5655132113       1.135456454987       0.8554656132131
04OCT2012 -3.54654897465    0.3534435219          1.56321321313546
04DEC2012 -2.213546698        1.165463561654        .
;

proc transpose data=test out=test2;
by date;
var xys xjz xms;
run;

proc sort data=test2;
by date decending col1 ;
run;

proc transpose data=test2(drop=_name_) out=a(drop=_name_) prefix=value;
by date;
var  col1;
run;
proc print;run;

proc transpose data=test2 out=b(drop=_:) prefix=namevar;
by date;
var _name_ ;
run;

proc print;run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
pobel + 1 + 1 + 1 精彩帖子

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

地板
pingguzh 发表于 2012-11-28 12:21:07
从程序的运行扩展性,我觉得bobguy的要好一些,但是我的电脑运行这个程序的时间是2秒左右
pobel的程序在data步里运行,没有涉及到proc步,速度更快,我用了大概0.2秒
谢谢两位的指点
上面这个问题还是希望能够得到帮忙
统计爱好

7
pingguzh 发表于 2012-11-28 13:58:45
ok,自己弄明白了
array _have (3) xys xjz xms; 应该不能用array _have (3)  xms-xys这个句子
call sortn(value3,value2,value1);也不能写为call sortn(value3-value1);
原因不懂。。。。
统计爱好

8
pobel 在职认证  发表于 2012-11-28 14:43:33
pingguzh 发表于 2012-11-28 13:58
ok,自己弄明白了
array _have (3) xys xjz xms; 应该不能用array _have (3)  xms-xys这个句子
call sor ...
array _have (3) xys xjz xms;  可以用array _have (3) xys--xms;
中间的两个‘-’表示按照变量在数据集中的位置从xys到xms的所有变量。

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
ziyenano + 1 + 1 + 1 精彩帖子

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

和谐拯救危机

9
hellheaven 发表于 2012-11-28 16:52:27
真的是学习了 非常感谢

10
bobguy 发表于 2012-11-29 07:50:10
pingguzh 发表于 2012-11-28 12:21
从程序的运行扩展性,我觉得bobguy的要好一些,但是我的电脑运行这个程序的时间是2秒左右
pobel的程序在da ...
Unless the performance is an issue, saving a couple of seconds is not much. Simple to understanding and maintenance free are much more important in programming.

Still in this case, the transpose beats the other one by about factor 3. See the log attached below.

157  data test;
158    array x(*) x1-x100;
159    do date=1 to 10000;
160       do j=1 to dim(x);
161         x[j]=ranuni(123);
162       end;
163       output;
164    end;
165    keep date x:;
166  run;

NOTE: The data set WORK.TEST has 10000 observations and 101 variables.
NOTE: DATA statement used (Total process time):
      real time           0.05 seconds
      cpu time            0.06 seconds


167
168  %let time=%sysfunc(time( ));
169  data a(keep= date value:) b(keep=date var:) ;
170     set test;
171     array _have (*) x1-x100;
172     array _sorted (*) value1-value100;
173     array _name (*) $ var1-var100;
174
175     *** Sort values;
176     do i=1 to dim(_have);
177        _sorted(i)=_have(i);
178     end;
179     call sortn(value3,value2,value1);
180
181     *** Get variable names;
182     do i=1 to dim(_sorted);
183        do j=1 to dim(_Have);
184                if _have(j)=_sorted(i) then _name(i)=vname(_have(j));
185            end;
186     end;
187  run;

NOTE: There were 10000 observations read from the data set WORK.TEST.
NOTE: The data set WORK.A has 10000 observations and 101 variables.
NOTE: The data set WORK.B has 10000 observations and 101 variables.
NOTE: DATA statement used (Total process time):
      real time           3.07 seconds
      cpu time            3.07 seconds


188
189  %put >>>>>time of array= %sysevalf(%sysfunc(time( ))-&time)<<<<<;
>>>>>time of array= 3.0779999998922<<<<<
190
191  %let time=%sysfunc(time( ));
192
193  proc transpose data=test out=test2;
194  by date;
195  var x1-x100;
196  run;

NOTE: There were 10000 observations read from the data set WORK.TEST.
NOTE: The data set WORK.TEST2 has 1000000 observations and 3 variables.
NOTE: PROCEDURE TRANSPOSE used (Total process time):
      real time           0.20 seconds
      cpu time            0.18 seconds


197
198  proc sort data=test2;
199  by date decending col1 ;
200  run;

NOTE: There were 1000000 observations read from the data set WORK.TEST2.
NOTE: The data set WORK.TEST2 has 1000000 observations and 3 variables.
NOTE: PROCEDURE SORT used (Total process time):
      real time           0.31 seconds
      cpu time            0.73 seconds


201
202  proc transpose data=test2(drop=_name_) out=a(drop=_name_) prefix=value;
203  by date;
204  var  col1;
205  run;

NOTE: There were 1000000 observations read from the data set WORK.TEST2.
NOTE: The data set WORK.A has 10000 observations and 101 variables.
NOTE: PROCEDURE TRANSPOSE used (Total process time):
      real time           0.22 seconds
      cpu time            0.20 seconds


206
207
208  proc transpose data=test2 out=b(drop=_:) prefix=namevar;
209  by date;
210  var _name_ ;
211  run;

NOTE: There were 1000000 observations read from the data set WORK.TEST2.
NOTE: The data set WORK.B has 10000 observations and 101 variables.
NOTE: PROCEDURE TRANSPOSE used (Total process time):
      real time           0.36 seconds
      cpu time            0.23 seconds


212
213  %put >>>>>time of transpose= %sysevalf(%sysfunc(time( ))-&time)<<<<<;
>>>>>time of transpose= 1.13199999999778<<<<<

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

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