SAS中文论坛
标题:
找最高级
[打印本页]
作者:
Lctrapani
时间:
2014-6-19 12:27
标题:
找最高级
本帖最后由 Lctrapani 于 2014-6-19 12:27 编辑
数据约40.000条,如下:Data Konzern;
Input ID konzernID;
cards;
1 18
2 5
3 18
4 24
5 9
6 9
7 15
8 12
9 102
....
;
run;
问题:如何将每个ID所对应的最高级konzernID找到?
上面例子找到最高级后:
1 18 18
2 5 1023 18 18
4 24 24
5 9 102
6 9 102
......
有的ID的下一级就是最高级了,有的要经过几级才达到最高级。有什么简单的好办法吗?
作者:
mono
时间:
2014-6-19 14:09
数据到底是是什么样的?没搞明白
1 18
2 5
2 1023
2 18
2 18
?
作者:
Lctrapani
时间:
2014-6-20 01:48
Sorry! 应该是:
找到最高级后:
ID konzernID highestID
1 18 18
2 5 102 *这里的102 是这样找到的:2的下一级是5,5的下一级是9,9的下一级是102,102没有下一级了,那么102 就是2的最高级了。真实数据是:ID是一家子公司的编号,这里是2,它的母公司是5,5又是编号为9的公司的子公司,如果在这四万条的数据中没有编号为ID=9的子公司,那么9就是最高级的Konzern(康采恩,母公司)了。如果有,那么看它的下一级102是否是某家公司的子公司,也就是能否在数据中找到ID=102,找不到,102就是要找的最高级。;
3 18 18
4 24 24
5 9 102
6 9 102
7 15 15 *再说明一下,15在这个例子中既是7的直接母公司,也是7的最高级母公司。
.......
我虽然解决了问题,但是用了20多步的DATA和SQL
。应该有更简洁漂亮的解决方法。
谢谢关注!请继续关注。
作者:
愤怒的老鸟
时间:
2014-6-24 17:49
用IML。。。。。。
作者:
Lctrapani
时间:
2014-6-25 05:13
Really? 等出差回来一定试一试。
先谢谢了。
作者:
6皮皮9
时间:
2014-7-1 18:55
我刚写了这个,还可以用,对于小数据集。数据集Result就是你要的结果了
可能还需要调试
data konzern;
Input ID konzernID;
cards;
1 18
2 5
3 18
4 24
5 9
6 9
7 15
8 12
9 102
;
run;
proc iml;
use konzern;
read all var _num_ into m;
close konzern;
a=m[,1];
b=m[,2];
create max var {max_number};
do i=1 to nrow(m);
if ncol(loc(a=b[i,]))>0 then do;
c=loc(a=b[i,]);
max_num=b[c,];
do while(ncol(loc(a=max_num))>0);
d=loc(a=max_num);
max_num=b[d,];
end;
end;
else do;
max_num=b[i,];
end;
edit max;
append from max_num;
end;
quit;
data result;
merge konzern max;
run;
作者:
6皮皮9
时间:
2014-7-1 19:16
如果出现这样的情况,ID数大于KONZERNID的话,这个程序就会进入到死循环了。比如这里我修改数据 ID 5对应的数据是2,那么他就返回查到ID 2的数值是5,这样就循环死了。这样的话,你自己要添加一个判定条件哦。
data konzern2;
Input ID konzernID;
cards;
1 18
2 5
3 18
4 24
5 2
6 9
7 15
8 12
9 102
;
run;
欢迎光临 SAS中文论坛 (https://mysas.net/forum/)
Powered by Discuz! X3.2