楼主: Rock2000
1434 7

重名对象id赋予 [推广有奖]

  • 1关注
  • 24粉丝

已卖:6892份资源

学术权威

23%

还不是VIP/贵宾

-

威望
1
论坛币
104790 个
通用积分
51.9656
学术水平
55 点
热心指数
74 点
信用等级
48 点
经验
23510 点
帖子
520
精华
0
在线时间
10924 小时
注册时间
2004-5-27
最后登录
2025-11-12

楼主
Rock2000 发表于 2012-11-2 17:29:25 |AI写论文
20论坛币
有一数据,是不同年份检查,比如1981年、1998年、2004年分别在同一地区检查一群人,每一年份ID号分别赋予,比如1981年的ID为X1+4为数字,1998年ID为X2+4为数字,2004年ID为X3+4为数字,其中部分对象某两年或3年份均参加,导致数据库中某些对象是重复的,现想知道某年份对象哪些年份尚参加检查,并且其对应ID是多少?数据如下:
ID            姓名  
X10001   张三
X21001   张三
X10001   李四
X20012   李四
X30052   李四

变为
ID          ID1981    ID1998      ID2004     姓名
X10001                 X21001                      张三
X21001 X10001                                      张三
X10001                 X10001    X30052     李四
X20012  X10001                    X30052    李四
X30052  X10001  X20012                      李四
如何编程?





最佳答案

Imasasor 查看完整内容

不明白你的最终目的,但还是按照你的要求写了一下,有点长,自己优化一下
关键词:是多少 数据库 姓名 数据库

回帖推荐

Imasasor 发表于2楼  查看完整内容

不明白你的最终目的,但还是按照你的要求写了一下,有点长,自己优化一下

本帖被以下文库推荐

沙发
Imasasor 发表于 2012-11-2 17:29:26
  1. data a;
  2. input id $ name $;
  3. cards;
  4. X10001   张三
  5. X21001   张三
  6. X10001   李四
  7. X20012   李四
  8. X30052   李四
  9. ;
  10. run;

  11. data b;
  12. set a;
  13. code=substr(id,2,1);
  14. if code=1 then id1981=id;
  15. else if code=2 then id1998=id;
  16. else if code=3 then id2004=id;
  17. run;
  18. proc sort data=b ;
  19. by name;
  20. ;
  21. data c;
  22. set b;
  23. informat a1-a3 $8.;
  24. retain a1-a3;
  25. if first.name then do;
  26. a1="";
  27. a2="";
  28. a3="";
  29. end;
  30. if id1981^="" then a1=id1981;
  31. if id1998^="" then a2=id1998;
  32. if id2004^="" then a3=id2004;
  33. keep name a1-a3;
  34. if last.name;
  35. by name;
  36. run;
  37. proc sort data=a;
  38. by name;
  39. ;
  40. data d;
  41. merge a c;
  42. by name;
  43. run;
  44. data e;
  45. set d;
  46. if a1=id then a1="";
  47. if a2=id then a2="";
  48. if a3=id then a3="";
  49. run;
复制代码
不明白你的最终目的,但还是按照你的要求写了一下,有点长,自己优化一下
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

藤椅
chaosxiao 发表于 2012-11-2 19:48:13
data a;
input id $6. name $8.;
cards;
X10001 张三
X21001 张三
X10001 李四
X20012 李四
X30052 李四
;
run;
proc sort data=a;by name;run;
data b;
set a;
if substr(id,1,2)="X1" then  id1981=id;
else if substr(id,1,2)="X2" then  id1998=id;
  else if substr(id,1,2)="X3" then  id2004=id;
run;

板凳
Rock2000 发表于 2012-11-2 21:07:40
chaosxiao 发表于 2012-11-2 19:48
data a;
input id $6. name $8.;
cards;
这个没有达到要求,谢谢。

报纸
chaosxiao 发表于 2012-11-2 22:13:07
data a;
input id $6. name $10.;
cards;
X10001 张三
X21001 张三
X10001 李四
X20012 李四
X30052 李四
;
run;
proc sort data=a;by name;run;
data aa;
set a;
if substr(id,1,2)="X1" then do;id1981=id;output;end;
run;
data bb;
set a;

if substr(id,1,2)="X2" then do;id1998=id;output;end;
run;
data cc;
set a;
if substr(id,1,2)="X3" then do;id2004=id;output;end;
run;
/*proc sort data=aa;by name;run;*/
/*proc sort data=bb;by name;run;*/
/*proc sort data=cc;by name;run;*/
data x;
merge aa bb cc;
by name;
run;
已有 1 人评分学术水平 热心指数 收起 理由
Rock2000 + 5 + 1 热心帮助其他会员

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

地板
Rock2000 发表于 2012-11-2 23:50:55
优化的程序如下,谢谢。

data a;
input id $ name $;
cards;
X10001   张三
X21001   张三
X10001   李四
X20012   李四
X30052   李四
X10112   王五
X30998   王五
;
run;

data b;
set a;
code=substr(id,2,1);
if code=1 then id1981=id;
else if code=2 then id1998=id;
else if code=3 then id2004=id;
run;
proc sort data=b ;
by name;
;
data c;
set b;
informat a1-a3 $8.;
retain a1-a3;
if first.name then do;
a1="";
a2="";
a3="";
end;
if id1981^="" then a1=id1981;
if id1998^="" then a2=id1998;
if id2004^="" then a3=id2004;
keep name a1-a3;
if last.name;
by name;
run;

proc sort data=a;
by name;
;
data d;
merge a c;
by name;
run;
data e;
set d;
if a1=id then a1="";
if a2=id then a2="";
if a3=id then a3="";
run;

data e; set e;
rename a1=id1981
       a2=id1998
      a3=id2004;
run;

7
Rock2000 发表于 2012-11-3 00:07:25
chaosxiao 发表于 2012-11-2 22:13
data a;
input id $6. name $10.;
cards;
程序没有编完整,我补齐。

data a;
input id $6. name $10.;
cards;
X10001   张三
X21001   张三
X10001   李四
X20012   李四
X30052   李四
X10112   王五
X30998   王五
;
run;
proc sort data=a;by name;run;
data aa;
set a;
if substr(id,1,2)="X1" then do;id1981=id;output;end;
run;
data bb;
set a;

if substr(id,1,2)="X2" then do;id1998=id;output;end;
run;
data cc;
set a;
if substr(id,1,2)="X3" then do;id2004=id;output;end;
run;
/*proc sort data=aa;by name;run;*/
/*proc sort data=bb;by name;run;*/
/*proc sort data=cc;by name;run;*/
data x;
merge aa bb cc;
by name;
run;

data x; set x; drop id; run;/*必需去掉id,不如其它id号的记录会不出现*/

data z;
merge a x; by name;
run;

data z; set z;
if substr(id,2,1)=1 then id1981=" ";
else if substr(id,2,1)=2 then id1998=" ";
else if substr(id,2,1)=3 then id2004=" ";
run;


8
Rock2000 发表于 2012-11-3 16:26:45
/*方法3,这方法更简单了*/

data a;
input id $6. name $10.;
cards;
X10001   张三
X21001   张三
X10001   李四
X20012   李四
X30052   李四
X31052   李四
X10112   王五
X10998   王五
;
run;

data b1; set a;
length id1981 $8.;
if substr(id,2,1)=1 then id1981=id;
keep name id1981;
if id1981=" " then delete;
run;

data b2; set a;
length id1998 $8.;
if substr(id,2,1)=2 then id1998=id;
keep name id1998;
if id1998=" " then delete;
run;

data b3; set a;
length id2004 $8.;
if substr(id,2,1)=3 then id2004=id;
keep name id2004;
if id2004=" " then delete;
run;

proc sort data=b1; by name; run;
proc sort data=b2; by name; run;
proc sort data=b3; by name; run;

data b; merge b1 b2 b3; by name; run;

proc sort data=a; by name; run;
/*关键是把所有重复姓名的ID变成是一个姓名的记录*/
data c; merge a b; by name;
run;
data c; set c;
if substr(id,2,1)=1 then id1981="";
if substr(id,2,1)=2 then id1998="";
if substr(id,2,1)=3 then id2004="";
run;

proc print data=c; run;

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

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