楼主: funwin
4100 10

[原创博文] 求助 如何能让每家公司的ID都统一为 该公司第一个出现的non-missing ID? [推广有奖]

  • 0关注
  • 2粉丝

硕士生

85%

还不是VIP/贵宾

-

威望
0
论坛币
177 个
通用积分
0
学术水平
0 点
热心指数
4 点
信用等级
0 点
经验
2256 点
帖子
192
精华
0
在线时间
131 小时
注册时间
2007-11-7
最后登录
2016-1-22

楼主
funwin 发表于 2010-3-29 23:52:01 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教高手,如何能让每家公司的ID都统一为该公司第一个出现的non-missing ID
比如:
Co
date
id

1001 200509 2
1001 200510 6
1001 200511 2
1001 200512 6
1119 200112 .
1119 200201 .
1119 200202 6
1119 200203 8

变成:
Co
date
id

1001 200509 2
1001 200510 2
1001 200511 2
1001 200512 2
1119 200112 .
1119 200201 .
1119 200202 6
1119 200203 6

该如何编code?
输入语句如下:
data a;

input company date:yymmn6. id;


format date yymmn6.;


datalines;

1001 200509 2
1001 200510 6
1001 200511 2
1001 200512 6
1119 200112 .
1119 200201 .
1119 200202 6
1119 200203 8

;
run;
二维码

扫码加我 拉你入群

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

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

关键词:missing SSIN Miss Iss ING

回帖推荐

paladin112 发表于5楼  查看完整内容

调整一下应该可以了; data a; input company date:yymmn6. id; format date yymmn6.; datalines; 1001 200509 2 1001 200510 6 1001 200511 2 1001 200512 6 1119 200112 . 1119 200201 . 1119 200202 6 1119 200203 8 ; run; proc sort data=a; by company date ; run; data a0(drop = date rename = (id=newid)); set a; by company date; if id ne .; if first.company; run; ...

本帖被以下文库推荐

沙发
guoluo 发表于 2010-3-30 10:22:32
data a;

input company date:yymmn6. id;

format date yymmn6.;

if missing(id) then mis='yes';
else mis='no';

datalines;
1001 200509 2
1001 200510 6
1001 200511 2
1001 200512 6
1119 200112 .
1119 200201 .
1119 200202 6
1119 200203 8

;
run;


proc sort data=a;
  by company mis date ;
run;

data a(drop=mis tempid);
  set a;
  by company mis date;
  retain tempid;
  if first.company then tempid=id;
  id=tempid;
  if mis='yes' then id=.;
run;

proc sort data=a;
  by company date ;
run;

藤椅
醉_清风 发表于 2010-3-30 14:12:02
中间一步是不是要改下?
data a(drop=mis tempid);
  retain tempid;
  set b;
  by company mis date;
  if first.company then tempid=id;
  id=tempid;
run;
从来不需要想起 永远也不会忘记

板凳
paladin112 发表于 2010-3-30 16:23:20
我的会把miss给盖掉,没考虑清楚,楼主无视我吧。。。

data a;

input company date:yymmn6. id;

format date yymmn6.;

datalines;
1001 200509 2
1001 200510 6
1001 200511 2
1001 200512 6
1119 200112 .
1119 200201 .
1119 200202 6
1119 200203 8

;
run;

proc sort data=a;
  by company date ;
run;

data a0(drop = date rename = (id=newid));
  set a;
  by company date;
  if id ne .;
  if first.company;
run;

data b(drop = id);
merge a a0;
by company;
run;

报纸
paladin112 发表于 2010-3-30 16:31:40
调整一下应该可以了;
data a;

input company date:yymmn6. id;

format date yymmn6.;

datalines;
1001 200509 2
1001 200510 6
1001 200511 2
1001 200512 6
1119 200112 .
1119 200201 .
1119 200202 6
1119 200203 8

;
run;

proc sort data=a;
  by company date ;
run;

data a0(drop = date rename = (id=newid));
  set a;
  by company date;
  if id ne .;
  if first.company;
run;

data b(drop = id);
merge a a0;
by company;
if id = . then newid=.;
run;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

地板
funwin 发表于 2010-4-1 08:34:10
I really appreciate your help. That code's so helpful.

7
funwin 发表于 2010-4-2 04:19:54
刚试用了楼上各位的方法,还是二楼的code最正确,是我所需要的,非常感谢!
三楼,五楼的方法没有能够识别missing values。
anyway,还是非常感谢楼上诸位!!!

8
funwin 发表于 2010-4-2 04:54:34
发现了新的问题,我要的: 让每家公司的ID都统一为该公司第一个出现的non-missing ID。
也就是说,如果数据后面出现了missing值,还是一样要和第一个nonmissing id值一样,但二楼的方法在这一点上不适用了。
比如:
Co  date  id
1001 200509 2
1001 200510 6
1001 200511 .   需要变2
1001 200512 6
1119 200112 .    一开始的missing值 不需要变
1119 200201 .   一开始的missing值 不需要变
1119 200202 6
1119 200203 .    需要变6
1119 200204 8
   变成:
Co  date  id
1001 200509 2
1001 200510 2
1001 200511 2
1001 200512 2
1119 200112 .
1119 200201 .
1119 200202 6
1119 200203 6
1119 200204 6
望高手 再次出手相助!

9
jingju11 发表于 2010-4-2 06:24:14
funwin 发表于 2010-4-2 04:54
发现了新的问题,我要的: 让每家公司的ID都统一为该公司第一个出现的non-missing ID。
也就是说,如果数据后面出现了missing值,还是一样要和第一个nonmissing id值一样,但二楼的方法在这一点上不适用了。
比如:
Co  date  id
1001 200509 2
1001 200510 6
1001 200511 .   需要变2
1001 200512 6
1119 200112 .    一开始的missing值 不需要变
1119 200201 .   一开始的missing值 不需要变
1119 200202 6
1119 200203 .    需要变6
1119 200204 8
   变成:
Co  date  id
1001 200509 2
1001 200510 2
1001 200511 2
1001 200512 2
1119 200112 .
1119 200201 .
1119 200202 6
1119 200203 6
1119 200204 6
望高手 再次出手相助!

  1. PROC SORT OUT = A; BY company; RUN;
  2. DATA B;
  3. DO UNTIL(LAST.company);
  4.   SET A; BY company;
  5.   IF (NOT MISSING(ID)) THEN DO;
  6.    _ID = ID;
  7.    LEAVE;
  8.   END;
  9. END;
  10. DO UNTIL(LAST.company);
  11.   SET A; BY company;
  12.   New_ID =  _ID;
  13.   sum1 = SUM(sum1, 1);
  14.   sum2 = SUM(sum2, MISSING(ID));
  15.   IF (MISSING(ID) AND sum1 = sum2) THEN CALL MISSING(New_ID);
  16.   OUTPUT;
  17. END;
  18. DROP _ID sum:;
  19. RUN;
复制代码

10
funwin 发表于 2010-4-2 06:44:46
牛!!!
非常感谢jingju11, 受益匪浅!!!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 05:47