m******f 发帖数: 176 | 1 我在做一个link group的算法, 前面都做完了,做的也还不错。 但是最后这部分虽然
做出来了,
但是算法时间太长,没办法支持请各位想想办法。
我算出的data是这样的:
group_id id1 ID
1 A B
1 A C
1 A D
2 B A
2 B C
2 B D
3 C B
4 D A
4 D B
大家可以看出这些组我已经编好,而且没有遗漏,但是问题在于怎么删除这些多余的组
。 因为最终都
可以归结为一个组:
group_id id1 ID
1 A B
1 A C
1 A D
或者直接一列
group_id id
1 A
1 B
1 C
1 D
我用的方法占时太多,就是一个macro 每次选第一组,在剩下组中ID2删除第一组的ID |
d********h 发帖数: 2048 | 2 data tmp;
set group1;
x1=min(id1,id);
x2=max(id1,id);
proc sort nodupkey;by x1 x2;
proc print;var x1 x2 |
m******f 发帖数: 176 | 3 先谢再试
【在 d********h 的大作中提到】 : data tmp; : set group1; : x1=min(id1,id); : x2=max(id1,id); : proc sort nodupkey;by x1 x2; : proc print;var x1 x2
|
d********h 发帖数: 2048 | 4 data tmp;
set group1;
id=id;
output;
id=id1;
output;
proc sort nodupkey;by id; |
A*******s 发帖数: 3942 | 5 赞速度。我还在琢磨lz的帖子是啥意思,你就捣鼓出两种解法了。
【在 d********h 的大作中提到】 : data tmp; : set group1; : id=id; : output; : id=id1; : output; : proc sort nodupkey;by id;
|
m******f 发帖数: 176 | 6 留步,受我一拜
【在 d********h 的大作中提到】 : data tmp; : set group1; : id=id; : output; : id=id1; : output; : proc sort nodupkey;by id;
|
m******f 发帖数: 176 | 7 但是第一个好像还是有重复项
【在 d********h 的大作中提到】 : data tmp; : set group1; : id=id; : output; : id=id1; : output; : proc sort nodupkey;by id;
|
m******f 发帖数: 176 | 8 另外我忘了说,这里不是 只有 ABCD 这一个组,
还有别的组 , 比如
B K
B E
B F
E K
等等
【在 m******f 的大作中提到】 : 但是第一个好像还是有重复项
|
d********h 发帖数: 2048 | 9 忘了min不能用字符串,
data tmp;
set group1;
if id1>id then do;
x1=id1;x2=id;end;
else do;
x1=id;x2=id1;
end;
proc sort nodupkey;by x1 x2;
proc print;var x1 x2
【在 m******f 的大作中提到】 : 另外我忘了说,这里不是 只有 ABCD 这一个组, : 还有别的组 , 比如 : B K : B E : B F : E K : 等等
|
o****o 发帖数: 8077 | 10 if all ids are capitalized Char A-to-Z, then it is easy:
*-----------------------;
data yourdata;
input group_id id1 $ ID $;
datalines;
1 A B
1 A C
1 A D
2 B A
2 B C
2 B D
3 C B
4 D A
4 D B
5 B E
5 B K
5 B E
6 B F
7 E K
;
run;
data newdata;
array _C1[65:90] _temporary_;
do i=65 to 90; _C1[i]=0; end;
do until (eof);
|
|
|
m******f 发帖数: 176 | 11 数字型id可以自动转换为num
不过这个结果是
A B
A C
A D
B C <---
B D <---
这两个没有删除啊
【在 d********h 的大作中提到】 : 忘了min不能用字符串, : data tmp; : set group1; : if id1>id then do; : x1=id1;x2=id;end; : else do; : x1=id;x2=id1; : end; : proc sort nodupkey;by x1 x2; : proc print;var x1 x2
|
w*****e 发帖数: 806 | 12 牛人现身,,看不太懂code。。。
【在 o****o 的大作中提到】 : if all ids are capitalized Char A-to-Z, then it is easy: : *-----------------------; : data yourdata; : input group_id id1 $ ID $; : datalines; : 1 A B : 1 A C : 1 A D : 2 B A : 2 B C
|
m******f 发帖数: 176 | 13 no. all the ids are id like '012345' ,I just use A-Z to describe this
problem easily. Thank you for your code. But I do not understand some
meaning in it. ()_() !
【在 o****o 的大作中提到】 : if all ids are capitalized Char A-to-Z, then it is easy: : *-----------------------; : data yourdata; : input group_id id1 $ ID $; : datalines; : 1 A B : 1 A C : 1 A D : 2 B A : 2 B C
|
m******f 发帖数: 176 | 14 不过这个算法很好用,确实到了要的效果。就是不知如果不是 A-Z 的 id 怎么用
【在 o****o 的大作中提到】 : if all ids are capitalized Char A-to-Z, then it is easy: : *-----------------------; : data yourdata; : input group_id id1 $ ID $; : datalines; : 1 A B : 1 A C : 1 A D : 2 B A : 2 B C
|
o****o 发帖数: 8077 | 15 那种情况下,一样的思路,字符数字混合的可以考虑作一些编码变换
如果确实是很复杂的,可以用hash表,多几行代码而已
【在 m******f 的大作中提到】 : no. all the ids are id like '012345' ,I just use A-Z to describe this : problem easily. Thank you for your code. But I do not understand some : meaning in it. ()_() !
|
m******f 发帖数: 176 | 16 Sorry. I can not type Chinese in company. But I still have a question,
how can I realize the same function as rank, if I create a new index for my
id ?
【在 o****o 的大作中提到】 : 那种情况下,一样的思路,字符数字混合的可以考虑作一些编码变换 : 如果确实是很复杂的,可以用hash表,多几行代码而已
|
D******n 发帖数: 2836 | 17 i also dont understand lz's question, it must need some contextual knowledge
【在 A*******s 的大作中提到】 : 赞速度。我还在琢磨lz的帖子是啥意思,你就捣鼓出两种解法了。
|
o****o 发帖数: 8077 | 18 input(id, best.)
my
【在 m******f 的大作中提到】 : Sorry. I can not type Chinese in company. But I still have a question, : how can I realize the same function as rank, if I create a new index for my : id ?
|
S******y 发帖数: 1123 | 19 ########### Python ############
in_file = 'C:\\_original.txt' #oloolo s example data
f = open(in_file, 'r')
ls =[]
f.next() #skip header
for line in f:
obs, group_id, id1, ID = line.split()
if id1 in ls and ID in ls: #if both already in
pass
else: #if one of them is new
print group_id, id1, ID
ls.append(id1)
ls.append(ID)
ls = list(set(ls)) #dedupe
###################### END ################### |
m******f 发帖数: 176 | 20 不行,id 有的过了18位,不能直接做index, 需要做一个index再 转换
就是不知道怎么实现你那个rank函数的功能, 就是 index=fun(id) 这个fun怎么得
来?
【在 o****o 的大作中提到】 : input(id, best.) : : my
|
o****o 发帖数: 8077 | 21 build your own hash function
or use the hash table feature in SAS directly
【在 m******f 的大作中提到】 : 不行,id 有的过了18位,不能直接做index, 需要做一个index再 转换 : 就是不知道怎么实现你那个rank函数的功能, 就是 index=fun(id) 这个fun怎么得 : 来?
|