楼主: snaillily
2584 10

[问答] 数据处理求助 [推广有奖]

  • 0关注
  • 0粉丝

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
26 点
帖子
3
精华
0
在线时间
2 小时
注册时间
2010-7-6
最后登录
2013-6-21

楼主
snaillily 发表于 2013-6-13 23:36:23 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
                遇到一个棘手的数据处理问题,菜鸟傻眼了。请版上的牛人们给指点指点,谢谢!
        数据有ID和variable
        ID    Variable   Time
        1         x            1
        1         .             2
        1         x            3
        1         x            4
        1         x            5
        1          .            6
        1         x            7
        1         x            8
       
        (x代表有数值,.代表missing)
        对每个ID,我想取用的数据是持续有数值无missing的最长段(可能表达不清楚,例子里,我想取用的数据是time3-5,因为time3-5有连续3个数值,而其他的两段是1个数值和2个数值)。
        不知道表达清楚没有,我想了好久也没有头绪,google也查不出来,感觉可能需要用sql。
        求牛人指点!!跪谢啦!
       


二维码

扫码加我 拉你入群

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

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

关键词:数据处理求助 数据处理 Variable missing 数据处理问题 数据分析专题 数据处理 数据分析软件 数据分析报告 面板数据分析 excel数据分析 数据分析方法 项目数据分析

本帖被以下文库推荐

沙发
可~乐 发表于 2013-6-14 01:13:33
  1. data test;
  2. input ID $   Variable $  Time;
  3. cards;
  4. 1 x 1
  5. 1 .  2
  6. 1 x 3
  7. 1 x 4
  8. 1 x 5
  9. 1  . 6
  10. 1 x 7
  11. 1 x 8
  12. 2  . 6
  13. 2 x 7
  14. 2 x 8
  15. 3  . 6
  16. 3 x 7
  17. 3  . 6
  18. 3 x 7
  19. 3 x 8
  20. 3 x 7
  21. 3  . 6
  22. ;
  23. run;

  24. data want;
  25.         set test;
  26.         by id;
  27.         lag_Variable=lag(Variable);
  28.         if first.id then flag=1;
  29.         else if Variable^=lag_Variable then flag+1;
  30. run;

  31. proc sql noprint;
  32.         create table wanted as select
  33.         ID,Variable,Time
  34.         from (select *,count(flag) as nobs from want group by id,flag)
  35.         group by id
  36.         having  max(nobs)=nobs;
  37. quit;
复制代码

藤椅
snaillily 发表于 2013-6-14 03:11:15
谢谢回复,但是结果不是我想要的哦

板凳
邓贵大 发表于 2013-6-14 04:30:38
  1. data test;
  2. input ID [        DISCUZ_CODE_6        ]nbsp;  Variable [        DISCUZ_CODE_6        ]nbsp; Time;
  3. cards;
  4. 1 x 1
  5. 1 .  2
  6. 1 x 3
  7. 1 x 4
  8. 1 x 5
  9. 1  . 6
  10. 1 x 7
  11. 1 x 8
  12. ;
  13. run;

  14. proc format;
  15.         value $bin
  16.         '.' = '0'
  17.         other = '1'
  18.         ;
  19.         value bin
  20.         .-.z = '0'
  21.         other = '1'
  22.         ;
  23. data hell(drop=streak max_streak);
  24.         do until(last.ID);
  25.                 do streak=1 by 1 until(last.variable);
  26.                         set test;
  27.                         by ID Variable notsorted GroupFormat;
  28.                         format Variable $bin.;/*use format bin. if numeric*/
  29.                 end;
  30.                 If vvalue(variable)="1" then max_streak = max(max_streak, streak);
  31.         end;
  32.         do until(last.ID);
  33.                 do streak=1 by 1 until(last.variable);
  34.                         set test;
  35.                         by ID Variable GroupFormat notsorted;
  36.                 end;
  37.                 do until(last.variable);
  38.                         set test;
  39.                         by ID Variable GroupFormat notsorted;
  40.                         If value(variable)="1" then if streak = max_streak then output;
  41.                 end;
  42.         end;
  43. run;

  44. proc datasets nolist;
  45.         modify hell;
  46.         format Variable ;
  47. quit;
复制代码
  1. data test1;
  2.         do subID=1 by 1 until(last.ID);
  3.                 do until(last.Variable);
  4.                         set test;
  5.                         by ID Variable notsorted GroupFormat;
  6.                         format Variable $bin.;
  7.                         Dummy=(vvalue(variable)="1");
  8.                         output;
  9.                 end;
  10.         end;
  11. proc sql;
  12. create table temp as
  13.         select ID, subID, sum(dummy) as streak
  14.                 from test1
  15.                 group by ID, subID;
  16. create table hell1 as
  17.         select a.ID, a.Variable, a.Time from test1 a join (
  18.                 select a.ID, a.subID from temp a
  19.                         where a.streak = (select max(streak) from temp where ID=a.ID)
  20.                 ) b on a.ID=b.ID and a.subID=b.subID
  21.                 order by a.ID, a.Time;
  22. quit;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
scarfacetony + 1 + 1 + 1 精彩帖子

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

Be still, my soul: the hour is hastening on
When we shall be forever with the Lord.
When disappointment, grief and fear are gone,
Sorrow forgot, love's purest joys restored.

报纸
snaillily 发表于 2013-6-14 11:51:07
谢谢ls!!!!

地板
playmore 发表于 2013-6-14 13:13:52
邓贵大 发表于 2013-6-14 04:30
大哥你实在太敬业了,写了那么多

我过去写过一个宏,求序列中连续值的出现次数
https://bbs.pinggu.org/thread-2402204-1-1.html
可以用这个宏,得到的结果再用Proc sql求个最大值就好了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

7
hopewell 发表于 2013-6-14 14:32:51
看不懂题意,不明白想实现什么
观钓颇逾垂钓趣 种花何问看花谁

8
龙潭丰乐 学生认证  发表于 2013-6-15 09:35:02
  1. data quan;
  2. input id  variable $ time @@;
  3.   if variable ne lag(variable) then groupby+1;
  4.   cards;
  5.    1         x            1
  6.    1         .             2
  7.    1         x            3
  8.    1         x            4
  9.    1         x            5
  10.    1          .            6
  11.    1         x            7
  12.    1         x            8
  13. run;
  14. proc print data=quan;
  15. run;
  16. proc sql;
  17. create table quan1 as
  18.          select count(groupby)as number ,groupby
  19.                  from quan
  20.                  where variable='x'
  21.          group by groupby;
  22.         quit;
  23. proc sort data=quan1 out=quan2 ;
  24.    by  descending number;
  25. run;
  26. data quan3;
  27.    set quan2;
  28.       by  descending number;
  29.   if number ne lag(number) then rank+1;
  30.    if rank=1;
  31.    drop rank;
  32.    run;
  33. proc sql;
  34.   select  id , variable , time
  35.     from quan,quan3
  36.          where quan.groupby=quan3.groupby;
  37.         quit;


  38.         
复制代码

9
823954913 发表于 2013-6-16 08:51:19
data test;
input ID $   Variable $  Time;
cards;
1 x 1
1 .  2
1 x 3
1 x 4
1 x 5
1  . 6
1 x 7
1 x 8
2  . 6
2 x 7
2 x 8
3  . 6
3 x 7
3  . 6
3 x 7
3 x 8
3 x 7
3  . 6
;
run;

data test;
set test;
if variable="" then rank+1;
run;

proc sql;
create table test1 as
select *,count(rank) as n from test
group rank;
quit;

data test2;
set test1;
where n>=4 and variable^="";
run;

10
yongyitian 发表于 2013-6-16 11:00:59
  1. data temp1;
  2.      n = _n_;
  3.      retain gp 0;
  4.      set test;      
  5.      if missing(variable) then gp+1;
  6. run;
  7. proc sql;
  8.      create table result as
  9.      select a.ID, a.variable, a.time
  10.          from (select a.*, count(*) as count_num
  11.               from temp1 a
  12.               group by id, gp) a
  13.       where  a.variable is not null
  14.       group by a.id
  15.       having a.count_num = max(a.count_num)
  16.       order by a.n;
  17. quit;
复制代码

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

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