楼主: jiaqitang11
1726 8

[有偿编程] 数据转换问题 [推广有奖]

  • 0关注
  • 0粉丝

高中生

57%

还不是VIP/贵宾

-

威望
0
论坛币
5 个
通用积分
0.0057
学术水平
2 点
热心指数
0 点
信用等级
0 点
经验
176 点
帖子
18
精华
0
在线时间
33 小时
注册时间
2021-5-23
最后登录
2023-9-12

楼主
jiaqitang11 发表于 2021-5-23 01:35:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

原始数据Servedt有三列,ID,Begain date,End date(黄色区域)。 表示某ID在20197月至2020年6月一年间某医疗服务的开始日和终止日,所以ID是有重复的,代表不同的医疗服务开始日期和终止日期。


想转换成新的格式Servedt_sp(绿色区域),ID列和 日期列(2019年7月至2020年6月),如果ID在某月有医疗服务,就显示1,没有就显示0,这样我就可以知道在某个月是否这个ID有服务,而且我也可以计算某个月有多少ID用了服务。




用SAS怎么转换呢?试了两天,写不出来。


请看附件图片。谢谢大神

原始数据转换后
ID

Begain date

End date

ID

07/2019

08/2019

09/2019

10/2019

11/2019

12/2019

01/2020

02/2020

03/2020

04/2020

05/2020

06/2020

1000356

7/2/2019

12/12/2019

1000356

1

1

1

1

1

1

1

1

1

1

0

0

1000356

1/13/2020

1/31/2020

1004934

0

1

1

1

1

1

0

0

0

1

1

1

1000356

2/1/2020

3/1/2020

1005787

0

0

0

0

0

0

0

0

0

0

1

1

1000356

3/14/2020

4/20/2020

1112404

0

0

1

1

1

1

1

1

1

0

0

0

1004934

8/15/2019

12/5/2019

2585554

1

1

1

1

1

1

1

1

1

1

1

1

1004934

4/5/2020

6/30/2020

2354541

1

1

1

1

1

1

1

1

1

1

1

0

1005787

5/6/2020

5/29/2020

1005787

6/7/2020

6/30/2020

1112404

9/25/2019

12/8/2019

1112404

12/9/2019

1/25/2020

1112404

2/1/2020

3/31/2020

2585554

7/1/2019

6/15/2020

2354541

7/5/2019

11/25/2019

2354541

12/11/2019

12/30/2019

2354541

1/1/2020

5/30/2020

二维码

扫码加我 拉你入群

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

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

关键词:数据转换 served Serve 医疗服务 date

download.png (48.05 KB)

download.png

沙发
jiaqitang11 发表于 2021-5-24 10:56:45
大牛们呢?

藤椅
okkkkkkko 发表于 2021-8-11 18:06:51
jiaqitang11 发表于 2021-5-24 10:56
大牛们呢?
解决了吗?

板凳
jiaqitang11 发表于 2021-8-23 21:34:58
没呀,不会呀

报纸
wang1839 在职认证  发表于 2021-9-29 15:55:10
PROC IMPORT OUT=sheet1
    DATAFILE= "C:\Users\wang\Desktop\data.xlsx"
    DBMS=EXCEL  REPLACE;
    GETNAMES=YES;
        SHEET="sheet1";
RUN;

proc sql;
        create table s as select min(Begin_date) as min , max(End_date) as max from sheet1;
quit;

data s1;
set s;
ys=year(min);
ms=month(min);
ye=year(max);
me=month(max);
m=(ye-ys)*12+me-ms;
output;
do i=1 to m;
ms+1;
output;
end;
run;

data s2;
set s1 (keep= ys ms);
format stdate enddate date9.;
if ms>12 & mod(ms,12)^=0 then do;
ys=ys+int(ms/12);
ms=mod(ms,12);
end;
else if ms>12 & mod(ms,12)=0 then do;
ys=ys+int(ms/12)-1;
ms=12;
end;
stdate=mdy(ms,1,ys);
if ms<10 then m='0'||put(ms,best.);else m=put(ms,best.);
yymm=put(ys,best.)||m;
enddate=intnx('month',input(compress(yymm),yymmn6.),0,'end');
keep ys ms stdate enddate;
run;


data s3;
set  sheet1;
do i=1 to all;
set s2 point=i nobs=all;
if   Begin_date <=stdate<=End_date |  Begin_date <=enddate<=End_date
then s=1 ;else s=0;
output;
end;
run;

data s4;
        set s3(keep=id Begin_date End_date ys ms s);
        if ms<10 then ym=catx('-','0'||ms,ys);else ym=catx('-',ms,ys);
        ym=compress(ym);
        drop ys ms;
run;

proc sort data=s4;
        by id Begin_date  End_date;
run;


proc transpose data=s4  out=final(drop=_name_) name=_name_ prefix=s;
        by id Begin_date  End_date;
        id ym;
        var s;
run;


  PROC EXPORT DATA= final
            OUTFILE= "d:\final.XLSX"
            DBMS=excel REPLACE;
                        SHEET="sheet1";
RUN;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 50 + 2 + 2 + 2 精彩帖子

总评分: 论坛币 + 50  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

地板
jiaqitang11 发表于 2021-12-10 06:42:14
才看到,谢谢老师。

7
learsaas 发表于 2021-12-14 22:28:19
  1. data a;
  2.         input ID $7. Begain_date: MMDDYY10. End_date: MMDDYY10.;
  3.         format  Begain_date MMDDYY10. End_date MMDDYY10.;
  4.         cards;
  5. 1000356        7/2/2019 12/12/2019
  6. 1000356        1/13/2020 1/31/2020
  7. 1000356        2/1/2020 3/1/2020
  8. 1000356        3/14/2020 4/20/2020
  9. 1004934        8/15/2019 12/5/2019
  10. 1004934        4/5/2020 6/30/2020
  11. 1005787        5/6/2020 5/29/2020
  12. 1005787        6/7/2020 6/30/2020
  13. 1112404        9/25/2019 12/8/2019
  14. 1112404        12/9/2019 1/25/2020
  15. 1112404        2/1/2020 3/31/2020
  16. 2585554        7/1/2019 6/15/2020
  17. 2354541        7/5/2019 11/25/2019
  18. 2354541 12/11/2019 12/30/2019
  19. 2354541        1/1/2020 5/30/2020
  20. ;
  21. run;
  22. %macro a;
  23.         %let nBegain=0;%let nCk=-1;
  24.         proc sql noprint;
  25.                 select min(Begain_date),intck('month',min(Begain_date),max(End_date)) into :nBegain,:nCk
  26.                 from a;
  27.         quit;
  28.         proc sort data=a out=result;
  29.                 by ID;
  30.         run;
  31.         data result;
  32.                 set result;
  33.                 by ID;
  34.                 Begain_month=put(Begain_date,yymmn6.-l);
  35.                 End_month=put(End_date,yymmn6.-l);
  36.                 retain        
  37.                         %do i=0 %to &nCk;
  38.                                 T%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)
  39.                         %end;
  40.                 ;
  41.                 label        
  42.                         %do i=0 %to &nCk;
  43.                                 T%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)="%sysfunc(intnx(MONTH,&nBegain,&i),MMYYS7.)"
  44.                         %end;
  45.                 ;
  46.                 if first.ID then do ;               
  47.                         %do i=0 %to &nCk;
  48.                                 T%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)='0';
  49.                         %end;
  50.              end;
  51.                  %do i=0 %to &nCk;
  52.                     if Begain_month<="%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)"<=End_month then T%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)='1';
  53.                 %end;
  54.                 if last.ID;
  55.                 drop Begain_date End_date Begain_month End_month;
  56.         run;
  57. %mend;
  58. %a;
复制代码

8
learsaas 发表于 2021-12-14 22:28:51
  1. data a;
  2.         input ID $7. Begain_date: MMDDYY10. End_date: MMDDYY10.;
  3.         format  Begain_date MMDDYY10. End_date MMDDYY10.;
  4.         cards;
  5. 1000356        7/2/2019 12/12/2019
  6. 1000356        1/13/2020 1/31/2020
  7. 1000356        2/1/2020 3/1/2020
  8. 1000356        3/14/2020 4/20/2020
  9. 1004934        8/15/2019 12/5/2019
  10. 1004934        4/5/2020 6/30/2020
  11. 1005787        5/6/2020 5/29/2020
  12. 1005787        6/7/2020 6/30/2020
  13. 1112404        9/25/2019 12/8/2019
  14. 1112404        12/9/2019 1/25/2020
  15. 1112404        2/1/2020 3/31/2020
  16. 2585554        7/1/2019 6/15/2020
  17. 2354541        7/5/2019 11/25/2019
  18. 2354541 12/11/2019 12/30/2019
  19. 2354541        1/1/2020 5/30/2020
  20. ;
  21. run;
  22. %macro a;
  23.         %let nBegain=0;%let nCk=-1;
  24.         proc sql noprint;
  25.                 select min(Begain_date),intck('month',min(Begain_date),max(End_date)) into :nBegain,:nCk
  26.                 from a;
  27.         quit;
  28.         proc sort data=a out=result;
  29.                 by ID;
  30.         run;
  31.         data result;
  32.                 set result;
  33.                 by ID;
  34.                 Begain_month=put(Begain_date,yymmn6.-l);
  35.                 End_month=put(End_date,yymmn6.-l);
  36.                 retain        
  37.                         %do i=0 %to &nCk;
  38.                                 T%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)
  39.                         %end;
  40.                 ;
  41.                 label        
  42.                         %do i=0 %to &nCk;
  43.                                 T%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)="%sysfunc(intnx(MONTH,&nBegain,&i),MMYYS7.)"
  44.                         %end;
  45.                 ;
  46.                 if first.ID then do ;               
  47.                         %do i=0 %to &nCk;
  48.                                 T%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)='0';
  49.                         %end;
  50.              end;
  51.                  %do i=0 %to &nCk;
  52.                     if Begain_month<="%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)"<=End_month then T%sysfunc(intnx(MONTH,&nBegain,&i),YYMMN6.)='1';
  53.                 %end;
  54.                 if last.ID;
  55.                 drop Begain_date End_date Begain_month End_month;
  56.         run;
  57. %mend;
  58. %a;
复制代码

9
jiaqitang11 发表于 2022-1-14 10:39:49
learsaas 发表于 2021-12-14 22:28
谢谢老师。

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

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