全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4939 9
2012-11-28
前几天遇到了一个数据集排序的问题,也得到了高手们的细心指点,非常感谢
现在又遇到了另外一个相似的问题
假设数据集为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
谢谢,请高手指点程序应该怎么写呢


二维码

扫码加我 拉你入群

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

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

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

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

扫码加我 拉你入群

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

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

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;
   
二维码

扫码加我 拉你入群

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

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

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个时,这个程序好像就不简洁了
二维码

扫码加我 拉你入群

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

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

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;
二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群