楼主: tytyxiada
4264 15

[原创博文] 求助:SAS数据处理 [推广有奖]

  • 0关注
  • 2粉丝

已卖:6份资源

副教授

46%

还不是VIP/贵宾

-

威望
0
论坛币
1151 个
通用积分
1.0003
学术水平
2 点
热心指数
8 点
信用等级
1 点
经验
669 点
帖子
322
精华
0
在线时间
1416 小时
注册时间
2008-9-28
最后登录
2024-11-14

楼主
tytyxiada 在职认证  发表于 2011-2-24 22:38:38 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
数据集里面有三个变量,stkcd表示股票代码,year表示年份,money代表某项支出,我现在需要计算每家公司每年某项支出的变动情况,如果是从0变到1的,把两个观测输出到一个数据集中,如果是从1变到0的,输出到另一个数据集中,如果没变化的,则不输出。(注意:输出的是有变化的两个观测,也就是前后年的都要输出。)
二维码

扫码加我 拉你入群

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

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

关键词:sas数据处理 数据处理 stkcd money year 股票代码 money 数据分析专题 数据处理 数据分析软件 数据分析报告 面板数据分析 excel数据分析 数据分析方法 项目数据分析

数据.jpg (24.67 KB)

数据.jpg

回帖推荐

275769263 发表于7楼  查看完整内容

代码比较啰嗦...希望高手指点指点.... data a; input stkcd year money; dif=dif(money); cards; 000001 2001 0 000001 2002 0 000001 2003 0 000001 2004 0 000001 2005 1 000001 2006 1 000001 2007 0 000001 2008 0 000001 2009 1 000005 2001 0 000005 2002 0 000005 2003 0 000005 2004 0 000005 2005 0 000005 2006 0 ; run; data b; set a; if stkcd^=lag(stkcd) then dif=0; run; proc sort dat ...

本帖被以下文库推荐

沙发
tytyxiada 在职认证  发表于 2011-2-24 22:41:11
自己顶一下

藤椅
tytyxiada 在职认证  发表于 2011-2-25 09:26:31
希望大侠出手相助啊!!!

板凳
邢不行 在职认证  发表于 2011-2-25 09:47:15
  1. data a ;
  2.         set originaldata;
  3.         if  money=0 and lag(money)=1 then output;
  4. run;

  5. data b ;
  6.         set originaldata;
  7.         if  money=1 and lag(money)=0 then output;
  8. run;
复制代码
代码应该能用,但是估计比较土,还是等大侠更简单的答案吧

报纸
tytyxiada 在职认证  发表于 2011-2-25 10:24:06
4# 邢不行

谢谢你!不过运行下来有两个问题:
1、lag(money)只是把所有观测给滞后了一期,而没有考虑到与股票代码之间的匹配问题。这就导致代码000001的最后一个观测与代码000005的第一个观测配到一起了。
2、输出的只是变化后的那个观测,而没有实现注意:输出的是有变化的两个观测,也就是前后年的都要输出。
请大侠再帮我看看,谢谢!

地板
tytyxiada 在职认证  发表于 2011-2-25 23:25:21
自己再顶一下,希望大侠不吝赐教啊!

7
275769263 发表于 2011-2-28 09:45:47
代码比较啰嗦...希望高手指点指点....
data a;
input stkcd year money;
dif=dif(money);
cards;
000001 2001 0
000001 2002 0
000001 2003 0
000001 2004 0
000001 2005 1
000001 2006 1
000001 2007 0
000001 2008 0
000001 2009 1
000005 2001 0
000005 2002 0
000005 2003 0
000005 2004 0
000005 2005 0
000005 2006 0
;
run;
data b;
set a;
if stkcd^=lag(stkcd) then dif=0;
run;
proc sort data=b out=c;
by stkcd decending year;
run;
data d;
set c;
if stkcd=lag(stkcd) and 1=lag(dif) then dif2=1;
if stkcd=lag(stkcd) and -1=lag(dif) then dif2=-1;
run;
proc sort data=d ;
by stkcd  year;
run;
data e;
set d;
if dif=1 or dif2=1 then output;
run;
data f;
set d;
if dif=-1 or dif2=-1 then output;
run;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

8
ntsean 发表于 2011-2-28 10:36:21
试试这个

data a;
input stkcd year money;
cards;
000001 2001 0
000001 2002 0
000001 2003 0
000001 2004 0
000001 2005 1
000001 2006 1
000001 2007 0
000001 2008 0
000001 2009 1
000005 2001 0
000005 2002 0
000005 2003 0
000005 2004 0
000005 2005 0
000005 2006 0
;
run;

data b;
set a;
by stkcd;
lag_money=lag(money);
if first.stkcd then lag_money=money;
change=money-lag_money;
if change NE 0 then output;
drop lag_money;
proc print data=b;run;

9
tytyxiada 在职认证  发表于 2011-2-28 11:44:12
8# ntsean
请教高手:
程序的运行结果,只是输出了变化后的那个观测,而没有实现:输出的是有变化的两个观测,也就是前后年的都要输出。
请大侠再帮我看看,谢谢!

10
tytyxiada 在职认证  发表于 2011-2-28 12:01:25
7# 275769263
谢谢!这段代码可以用!非常感谢!

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

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