全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4834 11
2011-10-25
有如下数据集,共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
二维码

扫码加我 拉你入群

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

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

全部回复
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;
二维码

扫码加我 拉你入群

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

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

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了。

多谢啦。
二维码

扫码加我 拉你入群

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

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

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;
二维码

扫码加我 拉你入群

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

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

2011-10-27 08:35:37
每隔一段时间就会出现这么个同样的问题。然后,大家一再重复而回答。
京剧
二维码

扫码加我 拉你入群

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

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

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;
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群