楼主: 滞点
3335 8

[有偿编程] sas取均值问题 [推广有奖]

  • 1关注
  • 0粉丝

博士生

92%

还不是VIP/贵宾

-

威望
0
论坛币
1328 个
通用积分
5.8500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
43302 点
帖子
102
精华
0
在线时间
619 小时
注册时间
2015-7-27
最后登录
2024-4-24

5论坛币
有一笔资料,希望做到:将第五个数据和第十个数据取一个均值,之后第十五笔和第二十笔取均值……以此类推,最终输出均值。

data.xlsx (67.4 KB)

最佳答案

lovexialulu 查看完整内容

静态的 凑合
沙发
lovexialulu 发表于 2018-1-7 17:39:59 |只看作者 |坛友微信交流群
静态的 凑合
  1. data a;
  2. x=1;output;
  3. x=2;output;
  4. x=3;output;
  5. x=4;output;
  6. x=5;output;
  7. x=3;output;
  8. x=5;output;
  9. x=7;output;
  10. x=2;output;
  11. x=1;output;
  12. x=3;output;
  13. x=8;output;
  14. x=7;output;
  15. x=4;output;
  16. x=3;output;
  17. x=5;output;
  18. x=4;output;
  19. x=3;output;
  20. x=1;output;
  21. x=5;output;
  22. x=8;output;
  23. x=9;output;
  24. x=22;output;
  25. x=33;output;
  26. x=32;output;
  27. x=43;output;
  28. x=56;output;
  29. x=44;output;
  30. x=6;output;
  31. x=9;output;
  32. x=13;output;
  33. x=15;output;
  34. x=17;output;
  35. x=15;output;
  36. x=15;output;
  37. x=14;output;
  38. x=13;output;
  39. x=12;output;
  40. x=12;output;
  41. x=10;output;
  42. run;


  43. data b1(keep=i x) b2(keep=i x rename=(x=x_));
  44. set a;
  45. do i=1 to 99;
  46.   if _n_=10*i then output b1;
  47.   if _n_=5*(2*i-1) then output b2;
  48. end;
  49. run;

  50. data want;
  51. merge b1 b2;
  52. by i;
  53. if n(x,x_)=2 then av_x=(x+x_)/2;
  54. run;

  55. proc sql noprint;
  56. create table c as select avg(av_x) as avg from want where av_x ne .;
  57. quit;
复制代码

使用道具

藤椅
滞点 发表于 2018-1-8 10:03:17 |只看作者 |坛友微信交流群
lovexialulu 发表于 2018-1-7 20:11
静态的 凑合
您好,能不能麻烦稍微解释一下呢

使用道具

板凳
lovexialulu 发表于 2018-1-8 16:17:30 |只看作者 |坛友微信交流群
滞点 发表于 2018-1-8 10:03
您好,能不能麻烦稍微解释一下呢
b1 放的第10 20 30 笔值;
b2 放的第5 15 25 笔值;
merge b1 b2;横向得到第5 10;15 20;25 30;单个block的值

使用道具

报纸
流水不朽 发表于 2018-1-9 10:18:04 |只看作者 |坛友微信交流群
/*分组,按5个观察分组*/
data        tmp;
        do i=1 to 181;
                ee=int(i/5);
                output;
        end;
run;
/*按分组统计均值*/
proc summary data=tmp nway;
        var i;
        class ee;
        output out=tmp1(drop=_: ee) mean=;
run;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
bridge1989 + 2 + 2 + 2 + 1 精彩帖子

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

使用道具

地板
滞点 发表于 2018-1-14 20:14:37 |只看作者 |坛友微信交流群
流水不朽 发表于 2018-1-9 10:18
/*分组,按5个观察分组*/
data        tmp;
        do i=1 to 181;
您好,可否麻烦帮忙解释一下呢,有点不太明白呀

使用道具

7
流水不朽 发表于 2018-1-14 21:38:21 |只看作者 |坛友微信交流群
滞点 发表于 2018-1-14 20:14
您好,可否麻烦帮忙解释一下呢,有点不太明白呀
第一步是:模拟测试数据,使用 int 来求整,这样,只会按照分组间隔产生 新变量(5是你要求的间隔)
第二步是:按照新变量进行 分组求均值

看能否明白?
然后实际应用到你的数据集的时候,用_n_替代 i即可。

使用道具

8
eflucy 发表于 2018-1-18 17:29:31 |只看作者 |坛友微信交流群
你可以step1 留下obs为5的倍数的观测,保存为data1;
step2 直接merge data1 和data1(firstobs=2 rename=(value=value1)) 不需要by  留奇数观测 ,取平均就好了

_n_    value   value1

1  value5 value10
2  value10 value15
3  value15 value20
4 value20 value25
5 value25 value30
...



然后我也不知道你需要什么

使用道具

9
abc630110845 发表于 2018-3-13 00:50:42 |只看作者 |坛友微信交流群
DATA A;
        SET DATA_1;  /*DATA_1为原始数据*/
        N=_N_;
RUN;
/*取能被5整除的行*/
DATA B;
        SET A;
        IF MOD(N,5)=0;
RUN;
DATA C;
        SET B;
        OBS=_N_;
RUN;
DATA D;
        SET C;
        FUZHU=LAG(OBS);
        IF MOD(OBS,2)=0 THEN NEW_OBS=FUZHU;
        ELSE NEW_OBS=OBS;
RUN;
/*求平均*/
PROC SQL;
        CREATE TABLE FINAL AS
                SELECT
                        T1.NEW_OBS,
                        T1.TIME,
                        MEAN(PM) AS GROUP_MEAN
                        FROM D AS T1
                        GROUP BY NEW_OBS;
QUIT;

使用道具

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

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

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

GMT+8, 2024-4-25 16:34