楼主: 456852
3326 16

[原创博文] 敢请高手解惑一个数据问题 [推广有奖]

  • 0关注
  • 3粉丝

博士生

86%

还不是VIP/贵宾

-

威望
0
论坛币
71 个
通用积分
0.0012
学术水平
6 点
热心指数
10 点
信用等级
4 点
经验
12608 点
帖子
193
精华
0
在线时间
512 小时
注册时间
2009-1-18
最后登录
2017-8-12

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我有4个变量,数据结构如下:
customer  product   date                     category
1               001          12Feb2010          A
1               002          13Feb2010          B
1               003          19Feb2010          B
1               004          01Mar2010          A
2               005          12Mar2010          B
2               006          15Apr2010          A
2               007          18Apr2010          B
....
说明:
customer代表每一个客户id。
product代表每一个客户购买的产品,此id在数据集中是unique的,互不重复。
date代表此产品的买入时间。
category是此产品的类别,只有A和B两个值。
现要求:生成一个变量datediff,对每一个客户下的每一个产品,计算其距离上次购入A类产品的时间差(以天算)。如果是第一条记录或者之前没有购入A类产品,则为空值。

举例来说,在刚刚这个数据集中,最后应该如下:
customer  product   date                     category   datediff
1               001          12Feb2010          A              .                   (第一条记录)
1               002          13Feb2010          B              1                  (此条date=13Feb2010,上次买入A类产品是第一条记录date=12Feb2010,故为1)
1               003          19Feb2010          B              7                  (此条date=19Feb2010,上次买入A类产品是第一条记录date=12Feb2010,故为7)
1               004          21Feb2010          A              9                  (此条date=21Feb2010,上次买入A类产品是第一条记录date=12Feb2010,故为9)
2               005          12Apr2010          B              .                    (第一条记录且之前无购买A纪录)
2               006          15Apr2010          A               .                   (之前无购买A纪录)
2               007          18Apr2010          B              3                   (此条date=18Apr2010,上次买入A类产品是第一条记录date=15Apr2010,故为3)
....
依次类推。
还请高手指教。。。。
二维码

扫码加我 拉你入群

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

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

关键词:Category Customer Product custom produc category customer product 产品

回帖推荐

soporaeternus 发表于10楼  查看完整内容

用了楼上的测试集,提供一种sql的解决思路,呵呵,希望对你有帮助

本帖被以下文库推荐

沙发
honghejing 发表于 2011-1-27 09:20:46 |只看作者 |坛友微信交流群
用这个试试

使用道具

藤椅
honghejing 发表于 2011-1-27 09:25:29 |只看作者 |坛友微信交流群
试试这个程序
data a;
   input a b;
cards;
1 2
1 4
2 1
2 6
;
run;

data b;
   set a;
   by a;
   c=lag(b);
   if first.a then d=.;
   else d=b-c;
run;

使用道具

板凳
456852 发表于 2011-1-28 11:42:49 |只看作者 |坛友微信交流群
烦请写一下code,谢谢了。

使用道具

报纸
hssnow 发表于 2011-1-28 18:43:28 |只看作者 |坛友微信交流群
  1. data a;
  2.     input customer $ product $ date date9. category $;
  3. datalines;
  4. 1               001 12Feb2010          A
  5. 1               002 13Feb2010          B
  6. 1               003 19Feb2010          B
  7. 1               004 01Mar2010          A
  8. 2               005 12Mar2010          B
  9. 2               006 15Apr2010          A
  10. 2               007 18Apr2010          B
  11. ;
  12. run;

  13. data b (drop=iddate);
  14.     set a;
  15.     by customer;
  16.     retain iddate;
  17.     if first.customer then iddate=date;
  18.     datediff=date-iddate;
  19.     if datediff=0 then datediff=.;
  20. run;
复制代码
My Blog: http:/hssnow.name/
宁静致远

使用道具

地板
456852 发表于 2011-1-28 19:38:35 |只看作者 |坛友微信交流群
hssnow 发表于 2011-1-28 18:43
  1. data a;
  2.     input customer $ product $ date date9. category $;
  3. datalines;
  4. 1               001 12Feb2010          A
  5. 1               002 13Feb2010          B
  6. 1               003 19Feb2010          B
  7. 1               004 01Mar2010          A
  8. 2               005 12Mar2010          B
  9. 2               006 15Apr2010          A
  10. 2               007 18Apr2010          B
  11. ;
  12. run;

  13. data b (drop=iddate);
  14.     set a;
  15.     by customer;
  16.     retain iddate;
  17.     if first.customer then iddate=date;
  18.     datediff=date-iddate;
  19.     if datediff=0 then datediff=.;
  20. run;
复制代码
这段code结果不对:
customer  product   date                     category   datediff
1               001          18305                  A               .
1               002          18306                  B              1
1               003          18312                  B              7
1               004          18322                  A              17
2               005          18333                  B              .
2               006          18367                  A               34
2               007          18370                  B               37
对照一下我发的期望结果,可知这段code不对。

使用道具

7
hssnow 发表于 2011-1-28 20:54:13 |只看作者 |坛友微信交流群
哦,是的,好像不对
My Blog: http:/hssnow.name/
宁静致远

使用道具

8
hssnow 发表于 2011-1-28 21:16:20 |只看作者 |坛友微信交流群
不好意思之前没有看清要求,修改了一下,不过可能有点麻烦。。。
  1. data hs.cha;
  2.     input customer $ product $ date date9. category $;
  3. datalines;
  4. 1               001 12Feb2010          A
  5. 1               002 13Feb2010          B
  6. 1               003 19Feb2010          B
  7. 1               004 21Feb2010          A
  8. 2               005 12Apr2010          B
  9. 2               006 15Apr2010          A
  10. 2               007 18Apr2010          B
  11. ;
  12. run;
  13. proc sort data=hs.cha;
  14.     by customer category;
  15. run;
  16. data hs.cha2 (drop=iddate);
  17.     set hs.cha;
  18.     by customer category;
  19.     retain iddate;
  20.      if first.customer and category='A' then iddate=date;
  21.      datediff=date-iddate;
  22.      if datediff le 0 then datediff=.;
  23.          format date date9.;
  24. run;
  25. proc sort data=hs.cha2;
  26.     by customer product;

  27. run;
复制代码
My Blog: http:/hssnow.name/
宁静致远

使用道具

9
baoaibaobao 发表于 2011-1-29 20:55:24 |只看作者 |坛友微信交流群
楼上的代码仅限于楼主给的这么一点数据,看似结果是正确的,其实扩展一下,就会发现问题。
假如在同一个customer中有多个A,就不符合楼主要求了,可以用代码运行一下下面的数据(在楼主数据的后面加了customer等于3和4的观测),customer=4的观测中就会有问题。从楼主给的数据来看,product是唯一的,无论date是否也是逐渐增大的,代码如下:其中的宏参数n代表customer中的最大数值,这里为4。用数据测试已通过:
  1. data zachary;
  2.     input customer  product  date:date9. category $;
  3.     format date  date9.;
  4. datalines;
  5. 1               001  12Feb2010           A
  6. 1               002  13Feb2010           B
  7. 1               003  19Feb2010           B
  8. 1               004  21Feb2010           A
  9. 2               005  12Apr2010           B
  10. 2               006  15Apr2010           A
  11. 2               007  18Apr2010           B
  12. 3               008  19Apr2010           B
  13. 3               009  20Apr2010           A
  14. 3               010  21Apr2010           B
  15. 3               011  22Apr2010           B
  16. 4               012  23Apr2010           A
  17. 4               013  24Apr2010           A
  18. 4               014  25Apr2010           A
  19. 4               015  26Apr2010           B
  20. 4               016  27Apr2010           B
  21. ;
  22. option symbolgen mlogic mprint;
  23. %macro zachary(n);
  24. %do i=1 %to &n.;
  25.         data zachary&i.;
  26.             set zachary;
  27.                 if customer=&i.;
  28.                 format date_1 date_2 date9.;
  29.                 retain date_1;
  30.                 if category='A' then do;
  31.                         date_1=date;
  32.                         date_2=lag(date_1);
  33.                 end;
  34.                 else do;
  35.                         date_2=date_1;
  36.                 end;
  37.                 datediff=date-date_2;  
  38.         run;
  39. %end;
  40. data zachary_1;
  41.         set %do i=1 %to &n.;
  42.                 zachary&i.
  43.                 %end;;
  44.         drop date_1 date_2;run;
  45. proc delete data=%do i=1 %to &n.;
  46.         zachary&i  %end;;run;
  47. quit;
  48. %mend;
  49. %zachary(4);
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
hssnow + 1 + 1 谢谢指正~

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

使用道具

10
soporaeternus 发表于 2011-1-29 21:34:18 |只看作者 |坛友微信交流群
  1. proc sql;
  2.         create table b as
  3.                 select
  4.                         a.*
  5.                         ,case
  6.                                 when max(b.date)^=. then a.date-max(b.date)
  7.                                 else .
  8.                         end as datediff
  9.                 from Zachary a
  10.                 left join Zachary b
  11.                 on a.customer=b.customer
  12.                         and a.date>b.date
  13.                         and b.category='A'
  14.                 group by
  15.                         a.customer
  16.                         ,a.product
  17.                         ,a.date
  18.                         ,a.category
  19.         ;
  20. quit;
复制代码
用了楼上的测试集,提供一种sql的解决思路,呵呵,希望对你有帮助
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

Let them be hard, but never unjust

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 21:23