楼主: sean1945
4397 11

[原创博文] 如何每隔几个观测号赋值给新的变量并计算平均值 [推广有奖]

  • 0关注
  • 3粉丝

博士生

75%

还不是VIP/贵宾

-

威望
0
论坛币
1047 个
通用积分
87.3837
学术水平
3 点
热心指数
3 点
信用等级
3 点
经验
15958 点
帖子
217
精华
0
在线时间
455 小时
注册时间
2007-11-4
最后登录
2024-1-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
有如下数据集,共1200个观测,3个变量,一个是观测序号id,想增加一个新的变量stage,变量值按id每隔3个数据赋给一新值stage,stage=1,2 ...并按stage 计算其他变量的平均值及总和。
如何实现?
id          a       b
1          12    15
2          23    14
3          17    21
4          11    19
5          9      13
6         18     24
...        ...       ...
1200  
想要的数据集want1                                                        
id    a       b      stage
1    12    15      1
2    23    14      1
3    17    21      1
4    11    19       2
5    9      13       2
6   18     24       2
...  ...      ...       ...
1200                400
想要的数据集want2;
stage    mean_a     mean_b     sum_a   sum_b
1
2
3
...
400
二维码

扫码加我 拉你入群

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

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

关键词:平均值 stage Want mean 如何实现 平均值 如何

沙发
yumenderen 发表于 2011-10-25 17:33:27 |只看作者 |坛友微信交流群
data a;
input id a b;
datalines;
1          12    15
2          23    14
3          17    21
4          11    19
5          9      13
6         18     24
;
run;

%let num=3;
data a;
set a;
stage=round((_n_+1)/%num);run;

proc sql;
create table b as
select distinct stage as stage,avg(a) as mean_a,
avg(b) as mean_b,sum(a) as sum_a,sum(b) as sum_b
from a
group by 1 order by 1;quit;
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
sean1945 + 1 + 1 + 1 多谢大侠帮助,又学了不少东西。
Actree + 1 + 1 + 1 热心帮助其他会员

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

使用道具

藤椅
sean1945 发表于 2011-10-25 18:40:11 |只看作者 |坛友微信交流群
yumenderen 发表于 2011-10-25 17:33
data a;
input id a b;
datalines;
非常感谢yumenderen,
将stage=round((_n_+1)/%num);run;   中的“%num”改成"&num"就完全OK了。{:soso_e179:}{:soso_e179:}

多谢啦。
他大舅他二舅都是他舅,高桌子低板凳都是木头

使用道具

板凳
Eehanz 发表于 2011-10-26 23:55:14 |只看作者 |坛友微信交流群
yumenderen方法令我受益匪浅,但也可以用另外的一种方法:
data a;
input id a b;
datalines;
1          12    15
2          23    14
3          17    21
4          11    19
5          9      13
6         18     24
7          12    15
8          23    14
9          17    21
10          11    19
11         9      13
12        18     24
;
run;
data aa;
  set a;
  if _n_=1 then i=1;
  else  if mod(_n_-1,3) =0 then do;
   i+1;
  end;
  else if mod(_n_-1,3) ^= 0 then i+0;
run;
  

data aa_sts(drop=id num);
  set aa;
  by i;
  sum_a+a;
  sum_b+b;
  num+1;
  if last.i then do;
     avg_a=sum_a/num;
         avg_b=sum_b/num;
         output;
           sum_a=0;
     sum_b=0;
         num=0;
  end;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
sean1945 + 1 + 1 + 1 呵呵,感谢热心帮助。

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

使用道具

报纸
jingju11 发表于 2011-10-27 08:35:37 |只看作者 |坛友微信交流群
每隔一段时间就会出现这么个同样的问题。然后,大家一再重复而回答。
京剧

使用道具

地板
bobguy 发表于 2011-10-27 09:57:41 |只看作者 |坛友微信交流群
Here is a simple solution.

data t1;
   do id=1 to 1200;
      x=ceil(10*ranuni(123));
          y=ceil(10*ranuni(123));
          output;
        end;
run;

proc sql;
  select stage, mean(x) as avgx, sum(x) as sumx
    from
          ( select int((id-1)/3)+1 as stage, x
           from t1 )
  group by 1
  ;
  quit;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
sean1945 + 1 + 1 + 1 简洁通用,提供了另一种思路。

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

使用道具

7
sean1945 发表于 2011-10-28 08:21:52 |只看作者 |坛友微信交流群
Eehanz 发表于 2011-10-26 23:55
yumenderen方法令我受益匪浅,但也可以用另外的一种方法:
data a;
input id a b;
感谢Eehanz的热心帮助!
他大舅他二舅都是他舅,高桌子低板凳都是木头

使用道具

8
sean1945 发表于 2011-10-28 08:24:59 |只看作者 |坛友微信交流群
bobguy 发表于 2011-10-27 09:57
Here is a simple solution.

data t1;
呵呵,感谢大牛 bobguy的程序,很有启发。
同时也感谢 京剧的点评,这个确实需要总结一下,可以节约资源。
他大舅他二舅都是他舅,高桌子低板凳都是木头

使用道具

这三个程序都是首先能够确定每组数量是一定的,那要是每组观测数目可能不一样呢?

使用道具

10
denver 发表于 2012-3-30 11:35:35 |只看作者 |坛友微信交流群
谁难过谁知道 发表于 2012-3-30 10:43
这三个程序都是首先能够确定每组数量是一定的,那要是每组观测数目可能不一样呢?
不一样也得有个规律啊
Denver大家一起读Paper系列索引贴:
https://bbs.pinggu.org/thread-1430892-1-1.html

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-30 23:21