楼主: serenaakh
1650 8

[原创博文] 关于sas程序的两个问题~ 求各位帮帮忙 如何求出 各个企业前五年的中位数再把他们排序 [推广有奖]

  • 4关注
  • 1粉丝

本科生

90%

还不是VIP/贵宾

-

威望
0
论坛币
7 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
102 点
帖子
115
精华
0
在线时间
77 小时
注册时间
2010-10-14
最后登录
2016-5-30

楼主
serenaakh 发表于 2012-4-6 07:03:15 |AI写论文
10论坛币
96.jpg
我想用proc means求DP,cev, net_cev, sg的中位数,
但不是单纯的求,是求每个企业前五年的中位数,再把这些中位数排序(从大到小)
所以样本企业必须要六年以上,
而且要把 未满六年的企业给 去除~
但是还能把去除的企业保存在另一个文件里~

我的数据 应该是1981到2010年间的,但是由于很多公司不是从那么早开始建立的,
所有 各个企业 从各个年度开始的都有~
我以我不会弄~
拜托各位高手了~

先谢谢~~

最佳答案

mymine 查看完整内容

也可以,我不习惯用means而已 修改如下 /*按企业名和时间排序*/ proc sort data=a; by coname date; run; /*将各企业按时间计数*/ data a; set a; by coname date; if first.coname then n1=1; else n1+1; run; /*计算各企业的最大笔数*/ proc sql; create table b as select distinct *,max(N1) as nn from a group by coname; quit; /*取最大笔数大于5的前5年数据*/ proc sql; create table c as selec ...
关键词:sas程序 中位数 means mean cev 中位数 程序 如何 而且 样本

沙发
mymine 发表于 2012-4-6 07:03:16
也可以,我不习惯用means而已
修改如下
/*按企业名和时间排序*/
proc sort data=a;
by coname date;
run;
/*将各企业按时间计数*/
data a;
set a;
by coname date;
if first.coname then n1=1;
else n1+1;
run;
/*计算各企业的最大笔数*/
proc sql;
create table b as
select distinct *,max(N1) as nn
from a group by coname;
quit;

/*取最大笔数大于5的前5年数据*/
proc sql;
create table c as
select *
from b
where nn>5 and n1<6;
quit;
/*求中位数*/
proc means data=c;
var dp;
by coname;
output out=d median=med;
run;

藤椅
mymine 发表于 2012-4-6 08:29:01
如果只求前五年的中位数,那就简单了
以DP为例,将前五年的数据排序,取第三行的就是中位数了

/*按企业名和时间排序*/
proc sort data=a;
by coname date;
run;
/*将各企业按时间计数*/
data a;
set a;
by coname date;
if first.coname then n1=1;
else n1+1;
run;
/*计算各企业的最大笔数*/
proc sql;
create table b as
select distinct *,max(N1) as nn
from a group by coname;
quit;

/*取最大笔数大于5的前5年数据*/
proc sql;
create table c as
select *
from b
where nn>5 and n1<6;
quit;
/*按企业名和DP排序*/
proc sort data=c;
by coname dp;
run;
/*各企业分类计数*/
data c;
set c;
by coname dp;
if first.coname then n2=1;
else n2+1;
run;
/*去第三笔即为中位数*/
data d;
set c;
where n2=3;
drop n1 n2;
run;

板凳
mymine 发表于 2012-4-6 08:29:33
如果只求前五年的中位数,那就简单了
以DP为例,将前五年的数据排序,取第三行的就是中位数了

/*按企业名和时间排序*/
proc sort data=a;
by coname date;
run;
/*将各企业按时间计数*/
data a;
set a;
by coname date;
if first.coname then n1=1;
else n1+1;
run;
/*计算各企业的最大笔数*/
proc sql;
create table b as
select distinct *,max(N1) as nn
from a group by coname;
quit;

/*取最大笔数大于5的前5年数据*/
proc sql;
create table c as
select *
from b
where nn>5 and n1<6;
quit;
/*按企业名和DP排序*/
proc sort data=c;
by coname dp;
run;
/*各企业分类计数*/
data c;
set c;
by coname dp;
if first.coname then n2=1;
else n2+1;
run;
/*取第三笔即为中位数*/
data d;
set c;
where n2=3;
drop n1 n2;
run;

报纸
mymine 发表于 2012-4-6 08:33:24
如果不限定是前5年取中位数,就是说年数不定的话
可在proc sql中自己写公式,稍微复杂

地板
serenaakh 发表于 2012-4-6 08:40:30
mymine 发表于 2012-4-6 08:29
如果只求前五年的中位数,那就简单了
以DP为例,将前五年的数据排序,取第三行的就是中位数了
不能直接求各个企业前五年的 中位数
然后再把这些中位数从大到小 排序吗?
(恕我愚钝~问的问题白痴 也不要嘲笑噻~)
你生活在一个可以没有我的世界,我居住在一个只有你的天空...

7
serenaakh 发表于 2012-4-6 08:49:19
mymine 发表于 2012-4-6 08:33
如果不限定是前5年取中位数,就是说年数不定的话
可在proc sql中自己写公式,稍微复杂
data a2;
      set a1;
      if 1980<=date<=1985;
      if sg=. then delete;
          keep coname code6 date DP sg cen net_cev;
     
proc means data=a1;
     var DP sg cev net_cev;
         by code6 notsorted;
         output out=a2 median=MDP MSG MCEV Mnet_cev;
run;

我用这个程序 做出来了~
不知道对不对
但是做出来的 中位数 不是按照顺序排列的~
您能帮我看看么~?
先谢谢~
你生活在一个可以没有我的世界,我居住在一个只有你的天空...

8
mymine 发表于 2012-4-6 09:06:15
你的程序对的,我写的程序中前面一段是为了满足您的要求必须大于等于6笔记录,且取前五年的

9
serenaakh 发表于 2012-4-6 10:33:15
mymine 发表于 2012-4-6 09:06
你的程序对的,我写的程序中前面一段是为了满足您的要求必须大于等于6笔记录,且取前五年的
感恩~
非常感恩~
谢谢啦~
你生活在一个可以没有我的世界,我居住在一个只有你的天空...

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 03:14