SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 969|回复: 9
打印 上一主题 下一主题

如何在数据步求出多个变量的中位数?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-12-23 17:48:03 | 只看该作者

如何在数据步求出多个变量的中位数?

问题如标题所示,假设数据集中有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!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-12-23 18:17:08 | 只看该作者

Re: 如何在数据步求出多个变量的中位数?

9.2下可以用函数MEDIAN()
[url:239kahvw]http://support.sas.com/documentation/cdl/en/lrdict/62618/HTML/default/a002205763.htm[/url:239kahvw]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-12-24 15:14:33 | 只看该作者

Re: 如何在数据步求出多个变量的中位数?

谢谢TX!
但是我用的还是SAS8.2,能否通过简单的算法解决么?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-12-24 19:41:00 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-12-25 08:13:47 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-12-25 11:42:45 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-12-26 03:31:56 | 只看该作者

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:) -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-12-30 17:16:03 | 只看该作者

Re: 如何在数据步求出多个变量的中位数?

to hopewell

谢谢hopewell的方法,这个方法虽然需要两次转秩但是很经典,非常感谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-12-30 17:19:47 | 只看该作者

Re: 如何在数据步求出多个变量的中位数?

to cloudpan2002

学习了!用算法解决很强大:lol:,谢谢指点!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2010-1-15 09:17:46 | 只看该作者

Re: 如何在数据步求出多个变量的中位数?

to jingju11
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 高手!谢谢啦!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 08:02 , Processed in 0.075610 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表