SAS中文论坛

标题: 如何在数据步求出多个变量的中位数? [打印本页]

作者: shiyiming    时间: 2009-12-23 17:48
标题: 如何在数据步求出多个变量的中位数?
问题如标题所示,假设数据集中有var1-var5五个变量,如何新生成一个变量等于上述五个变量的中位数?

示例,通过简单的方法求解:
var1 var2 var3 var4 var5 median
1      2     3      4      5      ?
9      8     7      6      0      ?
11    22    88    99    25    ?
……

数据步中的mean可以方便的给出均值、std给出标准差之类;
但是如果需要计算中位数似乎没有现成的函数,如何简便的实现呢,谢谢各位TX!
作者: shiyiming    时间: 2009-12-23 18:17
标题: Re: 如何在数据步求出多个变量的中位数?
9.2下可以用函数MEDIAN()
[url:239kahvw]http://support.sas.com/documentation/cdl/en/lrdict/62618/HTML/default/a002205763.htm[/url:239kahvw]
作者: shiyiming    时间: 2009-12-24 15:14
标题: Re: 如何在数据步求出多个变量的中位数?
谢谢TX!
但是我用的还是SAS8.2,能否通过简单的算法解决么?
作者: shiyiming    时间: 2009-12-24 19:41
标题: Re: 如何在数据步求出多个变量的中位数?
还是用现成的函数好...
[code:p8kqngna]data raw;
        input var1 var2 var3 var4 var5;
datalines;
1 2 3 4 5
9 8 7 6 0
11 22 88 99 25
;

proc transpose data=raw out=temp prefix=obs name=var_name;
        var _all_;
run;

proc means data=temp noprint;
        output out=temp_median(drop=_type_ _freq_) median=;
run;

data temp;
        set temp temp_median(in=flag);
        if flag then var_name='median';
run;
       
proc transpose data=temp out=temp(drop=_name_);
        var obs:;
        id var_name;
run;[/code:p8kqngna]
作者: shiyiming    时间: 2009-12-25 08:13
标题: Re: 如何在数据步求出多个变量的中位数?
Excellent solution by hopewell. Here is another approach in case you really need it done through data steps:

[code:4i9g5qbk]data raw;
   input var1 var2 var3 var4 var5;
datalines;
1 2 3 4 5
9 8 7 6 0
11 22 88 99 25
;
run;

data median(keep = median);
  set raw;
  array raw var1-var5;

  do i = 1 to 5;
    do j = 1 to i;
      if raw(i) > raw(j) then do;
        temp = raw(i);
        raw(i) = raw(j);
        raw(j) = temp;
      end;
    end;
  end;

  median = raw(3);
run;

data results;
  merge raw median;
run;[/code:4i9g5qbk]
作者: shiyiming    时间: 2009-12-25 11:42
标题: Re: 如何在数据步求出多个变量的中位数?
[code:wf1pojun]data a;
input var1 var2 var3 var4 var5;
cards;
1 2 3 4 5
9 8 7 6 0
11 22 88 99 25
;
/*take advantage of odd number of variables*/
/*also account for missing values */
data _null_;
        set a;
   array var(5);
        call sortn(of var(*));
   put 'median ='  var(3);
        run;[/code:wf1pojun]
作者: shiyiming    时间: 2009-12-26 03:31
标题: Re: 如何在数据步求出多个变量的中位数?
Thanks jingju11! Just wondering if there is a quick way to both take advantage of the call sortn routine and have the results in a dataset as well.  <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
作者: shiyiming    时间: 2009-12-30 17:16
标题: Re: 如何在数据步求出多个变量的中位数?
to hopewell

谢谢hopewell的方法,这个方法虽然需要两次转秩但是很经典,非常感谢!
作者: shiyiming    时间: 2009-12-30 17:19
标题: Re: 如何在数据步求出多个变量的中位数?
to cloudpan2002

学习了!用算法解决很强大:lol:,谢谢指点!
作者: shiyiming    时间: 2010-1-15 09:17
标题: Re: 如何在数据步求出多个变量的中位数?
to jingju11
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 高手!谢谢啦!




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2