全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2445 2
2016-05-20
想请教各位大牛,对于类似下面这样的数据表格

Obs Name Day Time Amount
1 A 1 12:00:00 100
2 A 1 12:00:00 200
3 A 1 12:00:00 -50
4 B 1 12:00:00 50
5 B 2 13:00:00 100


我有几个处理这个数据的问题:

1. 怎样把Name、Day和Time都相同的Obs的Amount加起来?也就是说怎样在DATA里把Obs 1、2、3这几次观测数据的Amount加起来然后合成一项新的Obs?如果在DATA里做不到,该怎样用PROC写呢?

2. 如果我不是想加起来而是想保留Name、Day和Time都相同的项里面的最后一项(例如在Obs 1、2、3中只保留3)我应该怎么做?

3. 怎样去掉突变值?例如我想仅保留Amount是上一次Obs的10%到十倍的Obs,应该怎样写DATA里的WHERE条件呢?


4.怎样构建一个新的变量Difference,定义为本次Obs的Amount减去上一次Obs的Amount?

刚入SAS坑的小白万分感谢各位大牛!
二维码

扫码加我 拉你入群

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

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

全部回复
2016-5-23 10:31:18
1
proc sort data=have;
    by Name  Day Time;
run;

data want1;
retain name  day  time sum;
set have;
by name day time;
if first.time then sum=amount;
               else sum+amount;
if last.time;
keep name day time sum;
run;

2
proc sort data=have;
     by name day time;
run;

data want2;
  set have;
  by name day time;
  if last.time then output;
run;

3. 这个是同一个id之间比较? 还是A和B也可以比?

data tmp;
merge have(keep= name amount rename=(name=name_last amount=amount_last )) have(firstobs=2);
if name=name_last and abs(amount) le abs(amount_last);
run;

data tmp2;
  set have;
  amount_last=lag(amount);
run;

3和4 用lag函数就行 用我上一步那样merge也行你自己再接着写吧.......
二维码

扫码加我 拉你入群

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

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

2016-5-23 20:33:03
1. proc sql;
    create table xx as
    select *,
             sum(amount) as sum_amount
    from a.xx
    group by name;
    quit;
二维码

扫码加我 拉你入群

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

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

栏目导航
热门文章
推荐文章

说点什么

分享

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