楼主: ihust
9743 8

[问答] 分组计数、均值 [推广有奖]

  • 3关注
  • 2粉丝

已卖:315份资源

博士生

46%

还不是VIP/贵宾

-

威望
0
论坛币
10339 个
通用积分
0.0600
学术水平
2 点
热心指数
3 点
信用等级
2 点
经验
2767 点
帖子
247
精华
0
在线时间
159 小时
注册时间
2012-4-29
最后登录
2016-9-8

楼主
ihust 发表于 2013-8-13 19:10:07 |AI写论文
10论坛币
假设我的数据有如下两列:
var1 var2
A     10
B      11
A      20
C      30
B       15
D      14
B      23
.....

我现在想对var1进行分组计数、并计算每一组的均值。即要生成两个新变量var3和var4,var3用来存放每组对应的频数,var4用来存放每组对应的均值。

请问用data步程序如何做?

以前好像解决过类似的问题,但长时间没接触SAS,又忘记了。

关键词:data步 Data VaR 新变量 程序 如何

沙发
yuerqieqie 发表于 2013-8-13 20:19:32
proc summary data = yourdata nway;
    class var1;
    var var2;
    output out = summary(drop = _type_ index = (var1) rename = (_freq_ = var3)) mean = var4;
run;

data result;
    set yourdata;
    set summary key = var1/unique;
    _error_ = 0; if _iorc_ = 0;
run;

藤椅
jingju11 发表于 2013-8-14 00:39:08
in data step looks like not explicit. It is much clear for what it does in 2nd floor.
Of note: if VAR1 contains missing, you have to work extra lines on it.
JingJu
  1. data _null_;
  2.         call symputx('nobs',nobs);
  3.         if 0 then set have nobs =nobs;
  4.         call symputx('LenVar1',vlength(var1));
  5.         stop;
  6.         run;
  7. data have2; drop i;
  8.         array c[&nobs.] $&LenVar1. _temporary_; array n[&nobs.,3] _temporary_;
  9.         if _n_ =1 then do p =1 to nobs;
  10.                 set have point=p nobs=nobs;        
  11.                 do i =1 to dim(c);
  12.                         if (c[i] =' ' or var1 =c[i]) then do;
  13.                                 c[i] =var1;
  14.                                 n[p,3] =i; n[i,1] ++(var2 ^=.);n[i,2] ++var2;
  15.                                 leave;
  16.                                 end;
  17.                         end;
  18.                 end;
  19.         set have end=eof2;
  20.         var3 =n[n[_n_,3],1];
  21.         var4 =n[n[_n_,3],2]/n[n[_n_,3],1];
  22.         run;
复制代码

板凳
ihust 发表于 2013-8-14 10:00:33
jingju11 发表于 2013-8-14 00:39
in data step looks like not explicit. It is much clear for what it does in 2nd floor.
Of note: if V ...
jingju11, thanks for your answer, but I suddenly find a really easy way to solve this problem, for your codes, I don't understand somewhere, but I will learn it and make it clear, thanks again.

报纸
ihust 发表于 2013-8-14 10:01:07
yuerqieqie 发表于 2013-8-13 20:19
proc summary data = yourdata nway;
    class var1;
    var var2;
thanks for your answer.

地板
Silon.Jon 发表于 2013-8-15 10:03:03
干嘛非用data步,用sql很方便
proc sql;
create table temp as
select var1,var2,sum(var2),avg(var2)
from yourdata
group by var1

7
semenljw 在职认证  发表于 2013-8-16 12:48:47
看看这个是不是你想要的?
data a;
input type$ x@@;
cards;
a 3
b 9
a 20
b 15
a 7
b 12
;
run;
proc sort data=a out=b;
by type;
run;
data c(keep=type freq mean);
set b;
by type;
retain freq sum;
if first.type then do;
freq=0;
sum=0;
end;
freq+1;
sum+x;
if last.type;
mean=sum/freq;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
龙潭丰乐 + 1 + 1 + 1 观点有启发

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

8
tjnkswordsman 发表于 2013-11-2 11:35:42
你好,我也遇到这种列计数问题,请问您想到的简便方法是如何用data步求var3的?
在线等。

9
lionheartt 发表于 2020-3-15 19:42:32
tjnkswordsman 发表于 2013-11-2 11:35
你好,我也遇到这种列计数问题,请问您想到的简便方法是如何用data步求var3的?
在线等。
请问您解决了吗

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-21 04:39