楼主: chi4zb
2446 5

[问答] 求教:如何根据条件插入补齐行 [推广有奖]

  • 0关注
  • 0粉丝

大专生

60%

还不是VIP/贵宾

-

威望
0
论坛币
381 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
587 点
帖子
61
精华
0
在线时间
48 小时
注册时间
2012-3-15
最后登录
2020-1-28

楼主
chi4zb 发表于 2014-12-18 12:39:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教各位高人,如何根据条件在满足条件观测值的下方插入新行?


条件:根据Name 和id 顺序,截止到2010-01-09,如果id不连续(缺行)则补充行:
          ①id和date 按照排列顺序补齐   ②其他=上一行数据

数据如下:
  1. data Insert;
  2. input Name $ id date yymmdd10. money @;
  3. format date yymmdd10.;
  4. datalines;
  5. A 1 2007-01-09 90
  6. A 2 2008-01-09 80
  7. A 4 2010-01-09 70

  8. B 2 2006-01-09 89
  9. B 3 2007-01-09 98
  10. B 4 2008-01-09 87
  11. ;
  12. run;
复制代码

应该补齐如下 (若id不连续则补充行,截止2010年)
Name id date money


A 1 2007-01-09 90
A 2 2008-01-09 80
A 3 2009-01-09 80---------非首行,money=上一行money 80
A 4 2010-01-09 70

B 1 2005-01-09 0  ---------Name=B的首行,money取0或空.
B 2 2006-01-09 89
B 3 2007-01-09 98
B 4 2008-01-09 87
B 5 2009-01-09 87---------非首行,money=上一行87
B 6 2010-01-09 87
----------------------从ID=1开始截止2010年止,每年1月9日
二维码

扫码加我 拉你入群

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

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

关键词:insert format money FORMA Lines money 如何

沙发
Tigflanker 发表于 2014-12-18 16:01:32
1. 是补全2006-01-09 至 2010-01-09的所有1月9号的年吗?如果是,那第一个group为啥没对2006-01-09补全?
还是自动探测每个group最小的那个年,从最小的那个年至2010进行补齐?

2. 补入的MONEY值有什么要求?

藤椅
chi4zb 发表于 2014-12-18 18:21:28
Tigflanker 发表于 2014-12-18 16:01
1. 是补全2006-01-09 至 2010-01-09的所有1月9号的年吗?如果是,那第一个group为啥没对2006-01-09补全?
...
您好,是补全id=1 开始 至 2010-01-09的所有1月9号的年。第一个group是从 2007-01-09开始的,  ID=1 日期为2007-01-09
money=上一行money或首行时空.。见下。谢谢。

应该补齐如下 (若id不连续则补充行,截止2010年)
Name id date money

A 1 2007-01-09 90
A 2 2008-01-09 80
A 3 2009-01-09 80---------非首行,money=上一行80
A 4 2010-01-09 70

B 1 2005-01-09 0  ---------Name=B的 首行,money取0或空.
B 2 2006-01-09 89
B 3 2007-01-09 98
B 4 2008-01-09 87
B 5 2009-01-09 87---------非首行,money=上一行87
B 6 2010-01-09 87
----------------------截止2010年,每年1月9日

板凳
Tigflanker 发表于 2014-12-19 00:06:31
  1. data Insert;
  2. input Name $ id date yymmdd10. money @;
  3. format date yymmdd10.;
  4. datalines;
  5. A 1 2007-01-09 90
  6. A 2 2008-01-09 80
  7. A 4 2010-01-09 70
  8. B 2 2006-01-09 89
  9. B 3 2007-01-09 98
  10. B 4 2008-01-09 87
  11. ;run;

  12. data Want;
  13.   if 0 then set insert;
  14.   if _n_ = 1 then do;
  15.     dcl hash h(dataset:'insert',ordered:'y');
  16.         h.definekey('name','id');
  17.         h.definedata('money');
  18.         h.definedone();
  19.   end;

  20.   set insert;
  21.     by name;
  22.         retain firstdate;
  23.   output;

  24.   if first.name then do;
  25.     firstdate = intnx('year',date,1 - id,'s');

  26.     do id = 1 to intck('year',firstdate,'09JAN2010'd) + 1;
  27.       if h.check() then do;
  28.             date = intnx('year',firstdate,id - 1,'s');
  29.             rc = h.find(key:name,key:id - 1);
  30.             money = ~sign(rc) * money;
  31.             impute = 1;
  32.         output;

  33.             h.add();
  34.           end;
  35.     end;
  36.   end;

  37.   drop rc firstdate;

  38.   proc sort;
  39.     by name id;
  40. run;
复制代码
给,做的我好辛苦的。
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
李会超 + 40 热心帮助其他会员
chi4zb + 1 + 1 + 1 精彩帖子

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

报纸
老师她摸我 发表于 2014-12-19 13:10:50
试试这个:
  1. data Insert;
  2.         input Name $ id date yymmdd10. money @;
  3.         format date yymmdd10.;
  4. datalines;
  5. A 1 2007-01-09 90
  6. A 2 2008-01-09 80
  7. A 4 2010-01-09 70
  8. B 2 2006-01-09 89
  9. B 3 2007-01-09 98
  10. B 4 2008-01-09 87
  11. C 4 2008-01-09 87
  12. D 2 2010-01-09 87
  13. E 1 2010-01-09 87
  14. ;
  15. run;

  16. data _null_;
  17.         if 0 then set insert;
  18.         if _n_=1 then do;
  19.                 dcl hash h(dataset:'insert', ordered:'y');
  20.                 h.definekey('NAME', 'ID');
  21.                 h.definedata(all:'y');
  22.                 h.definedone();
  23.         end;
  24.         set insert end=eof;
  25.         do I=1 to 1000;
  26.                 if h.find(key:NAME, key:I) ne 0 then do;
  27.                         DATE=intnx('year', DATE, ifn(ID > I, I-ID, 1), 's');
  28.                         if DATE gt '09jan2010'd then leave;
  29.                         ID=I;
  30.                         if I=1 then MONEY=0;
  31.                         h.add();
  32.                 end;        
  33.         end;
  34.         if eof then h.output(dataset:'want');
  35. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
chi4zb + 1 + 1 + 1 精彩帖子

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

地板
chi4zb 发表于 2014-12-19 13:34:32
Tigflanker 发表于 2014-12-19 00:06
给,做的我好辛苦的。
辛苦。

自己功夫没到用数组做没成功,又学到哈希一招。

非常感谢!

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

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