楼主: 晓晓黑
2324 12

求助:SAS中加和情况的重复值怎么删除?求高人指点。。 [推广有奖]

  • 0关注
  • 0粉丝

已卖:161份资源

大专生

1%

还不是VIP/贵宾

-

威望
0
论坛币
245 个
通用积分
0
学术水平
2 点
热心指数
2 点
信用等级
2 点
经验
632 点
帖子
23
精华
0
在线时间
36 小时
注册时间
2011-5-22
最后登录
2013-5-1

楼主
晓晓黑 发表于 2013-4-12 09:18:39 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我现在需要将一些数据进行如下处理:

A



B



C



D



E



1


  

stkcd1

  
  

物业管理和其他

  
  

100

  

2007/12/31



1


  

stkcd1

  
  

房地产

  
  

200

  

2007/12/31



1



stkcd1



产品



300



2007/12/31



1


  

stkcd1

  
  

物业管理

  
  

250

  

2008/12/31



1


  

stkcd1

  
  

房地产

  
  

230

  

2008/12/31



1



stkcd1



产品



480



2008/12/31



2


  

stkcd2

  
  

服务业

  
  

120

  

2000/12/31



2



stkcd2



运输业务



130



2000/12/31



2


  

stkcd2

  
  

生物制药

  
  

140

  

2001/12/31



2



stkcd2



生物特征识别



150



2001/12/31



3


  

stkcd3

  
  

信息传播服务业

  
  

100

  

2003/12/31



3


  

stkcd3

  
  

房地产管理业

  
  

150

  

2003/12/31



3


  

stkcd3

  
  

租赁服务业

  
  

150

  

2003/12/31



3



stkcd3



房地产开发与经营业



300



2003/12/31




有些股票的D列数值是它上面两行数值的和,比如stkcd1的产品这一观测值,就等于上两行观测值的和,但是不是所有的股票都是如此,也不是每只股票每年都如此,我想将有加总情况的那一行删除(他们的C列名称也各不相同),要怎么处理?
求高人指点。。
二维码

扫码加我 拉你入群

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

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

关键词:求高人指点 高人指点 重复值 生物特征识别 stkcd 服务业

回帖推荐

yongyitian 发表于12楼  查看完整内容

不好意思, 用的英文系统,把变量名该成了拼音,rename 做的有点麻烦,不过比较清楚。 proc transpose data=sales_ind out=sales_ind_trans (drop= _name_ _label_); by stkcd name year; var sales_percent; id industry; run; data sales_ind_trans; set sales_ind_trans; rename Fang_DC = Fang_DC_Sales_Percent PiFa_LS = PiFa_LS_sales_percent ...

沙发
yongyitian 发表于 2013-4-12 09:49:53
data have;
input A B $ C;
datalines;
1 stkcd1 100
1 stkcd1 200
1 stkcd1 300
1 stkcd1 250
1 stkcd1 230
1 stkcd1 480
2 stkcd2 120
2 stkcd2 130
2 stkcd2 140
2 stkcd2 150
3 stkcd3 100
3 stkcd3 150
3 stkcd3 150
3 stkcd3 300
; run;
proc sort data=have;  by a;  run;

data have1;
    set have;
        by a;
        lag1 = lag(c);
        lag2 = lag2(c);
        if  c = lag1+lag2 then flag=1;
        drop lag1 lag2;
run;

data want;
   set have1;
   if flag=1 then delete;
   drop flag;
run;


藤椅
晓晓黑 发表于 2013-4-12 10:43:56
yongyitian 发表于 2013-4-12 09:49
data have;
input A B $ C;
datalines;
非常感谢~~
不过还有一点小问题,不是已经by a处理了吗?为什么lag(C)处理后不是每只股票前面都有一个缺失值生成呢?
这样如果前后两只股票相接的地方,两个数的和相加恰巧也等于下面一个数的和怎么办?

板凳
chaosxiao 发表于 2013-4-12 11:13:28
DATA A;
INPUT A  B $6. C $20. D  E $10.;
DATALINES;
1 stkcd1 物业管理和其他       100 2007/12/31
1 stkcd1 房地产              200 2007/12/31
1 stkcd1 产品                300 2007/12/31
1 stkcd1 物业管理            250 2008/12/31
1 stkcd1 房地产              230 2008/12/31
1 stkcd1 产品                480 2008/12/31
2 stkcd2 服务业              120 2000/12/31
2 stkcd2 运输业务            130 2000/12/31
2 stkcd2 生物制药            140 2001/12/31
2 stkcd2 生物特征识别        150 2001/12/31
3 stkcd3 信息传播服务业      100 2003/12/31
3 stkcd3 房地产管理业        150 2003/12/31
3 stkcd3 租赁服务业          150 2003/12/31
3 stkcd3 房地产开发与经营业   300 2003/12/31
;
RUN;

proc sort data=a;by b c;run;
data b;
set a;
by  b c;
j=lag(d);
retain f;
if first.b or first.c then f=d;
else f=d+j;
run;

报纸
chaosxiao 发表于 2013-4-12 11:21:25

proc sort data=a;by b c e;run;
data b;
set a;
by  b c e;

if first.b or first.c;

run;

地板
yongyitian 发表于 2013-4-12 11:28:38
该了一点, 要把c换成d 试试看。

data have;
input A B $ C;
datalines;
1 stkcd1 100
1 stkcd1 200
1 stkcd1 300
1 stkcd1 250
1 stkcd1 230
1 stkcd1 480
2 stkcd2 710
2 stkcd2 1190
2 stkcd2 140
2 stkcd2 150
3 stkcd3 100
3 stkcd3 150
3 stkcd3 150
3 stkcd3 300
; run;
proc sort data=have;  by a;  run;

data have1;
    set have;
        by a;
        lag1 = lag(c);
        lag2 = lag2(c);
        if first.a then do;
          flag=.;
                  n=1;
        end;
        else n+1;
        if  c = lag1+lag2 then flag=1;
        drop lag1 lag2;
run;

data want;
   set have1;
   if flag=1 and n not in(1 2) then delete;
   drop flag n;
run;

7
heiheiiamjj 发表于 2013-4-12 13:58:07
data ori_data;
input A B $ C $ D  E : YYMMDD10.;
format E YYMMDD10.;
datalines;
1  stkcd1 物业管理和其他     100  2007/12/31
1  stkcd1 房地产             200  2007/12/31
1  stkcd1 产品               300  2007/12/31
1  stkcd1 物业管理           250  2008/12/31
1  stkcd1 房地产             230  2008/12/31
1  stkcd1 产品               480  2008/12/31
2  stkcd2 服务业             120  2000/12/31
2  stkcd2 运输业务           130  2000/12/31
2  stkcd2 生物制药           140   2001/12/31
2  stkcd2 生物特征识别        150  2001/12/31
3  stkcd2 信息传播服务业      100  2003/12/31
3  stkcd2 房地产管理业        150  2003/12/31
3  stkcd2 租赁服务业          150  2003/12/31
3  stkcd2 房地产开发与经营业   300  2003/12/31
;

/*********计算每只股票每年的价值D的总和,(总和变量名还用D)*************/
proc means data=ori_data noprint;
by A E;
output out=sumdata sum=;
run;
/*****在原数据集的基础上,加上总和D/2.******/
data mergedata;
merge ori_data(in=bb )   sumdata(in=aa  rename=(d=d1)) ;
by A E;
if aa and bb;
d2=d1/2;
drop d1;
run;
/*****得到结果******/
data merge2;
retain A E B C D;
set mergedata;
if d2~=d  or _freq_=1;
keep A E B C D;
run;

8
晓晓黑 发表于 2013-4-12 17:27:44
yongyitian 发表于 2013-4-12 11:28
该了一点, 要把c换成d 试试看。

data have;
嗯嗯 这次可以了~~
如果是同样的问题,但是加总的那一行是在前面呢?
300
100
200
这样的,要删除300那一行怎么办?

9
yongyitian 发表于 2013-4-13 08:14:45
又改了一点,试试看。

data have;
input A B $ D;
datalines;
1 stkcd1 100
1 stkcd1 200
1 stkcd1 300
1 stkcd1 250
1 stkcd1 230
1 stkcd1 480
2 stkcd2 710
2 stkcd2 1190
2 stkcd2 140
2 stkcd2 150
3 stkcd3 100
3 stkcd3 150
3 stkcd3 150
3 stkcd3 300
4 stkcd4 100
4 stkcd4 200
4 stkcd4 100
4 stkcd4 100
; run;
proc sort data=have;  by a;  run;

data have1;
    set have;
        by a;
        lag1 = lag(D);
        lag2 = lag2(D);
        if first.a then do;
          flag=.;
          n=1;
        end;
        else n+1;
        if  D = lag1+lag2 then flag=1;
        drop lag1 lag2;
run;

proc sort data=have1 out=have2; by a descending n; run;

data have3;
    set have2;
        by a;
        lag1 = lag(D);
        lag2 = lag2(D);
        if first.a then do;
          flag1=.;
          n1=1;
        end;
        else n1+1;
        if  D = lag1+lag2 then flag1=1;
        drop lag1 lag2;
run;

proc sort data=have3; by a n; run;

data want;
   set have3;
   if flag  = 1 and n  not in(1 2) then delete;
   if flag1 = 1 and n1 not in(1 2) then delete;
   drop flag n flag1 n1;
run;

proc print data=want; run;

10
晓晓黑 发表于 2013-4-13 22:40:00
yongyitian 发表于 2013-4-13 08:14
又改了一点,试试看。

data have;
好的~非常感谢~

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-6 04:05