SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: shiyiming
打印 上一主题 下一主题

如何分组?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2010-7-11 11:42:12 | 只看该作者

Re: 如何分组?

[code:2h6470s1]data raw;
        input @3 x $ y;
datalines;
1 a 1
2 b 1
3 a 5
4 b 8
5 a 6
6 a 7
2 b 1
;
data a;
        set raw(where=(x='a'));
        id=_n_;
        rename y=a_y;
run;
data b;
        set raw(where=(x='b'));
run;
data out(keep=x y pair);
        if _n_=1 then do;
                        length x $8;
                        declare hash h(dataset:'a',ordered:'yes');
                        declare hiter iter('h');
                        h.defineKey('id');
                        h.defineData('id','a_y');
                        h.defineDone();
                        call missing(id,a_y);
                end;
        set b;
        pair=_n_;
        do while(iter.next()=0);
                if diff=. or abs(y-a_y) le diff then do;
                                diff=abs(y-a_y);
                                temp_ay=a_y;
                                a_key=id;
                        end;
        end;
        rc=h.remove(key:a_key);
        output;
        x='a';
        y=temp_ay;
        output;
run;[/code:2h6470s1]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
12#
 楼主| 发表于 2010-7-11 13:46:36 | 只看该作者

Re: 如何分组?

这个问题有人工智能的意思,差不多可以认为是相亲算法。 Hopewell的hash算法很好。

不过我觉得有个问题,就是非唯一解的问题。

拿相亲举例吧,如果条件相同的两个男的,谁先出场,谁最先配到最接近的那个女的,后来的从剩下中再找。
而上面没有考虑这个问题。如调整下面数据集其中两个数的位置,得到的配对不一样。

如:在这样的数据,后面加上一个排序,结果就不一样了。
data raw;
   input @3 x $ y;
datalines;
1 a 1
2 a 5
3 a 6
4 a 10
5 b 1
6 b 9
7 b 11
;
proc sort;
by  x descending  y ;
run;

结果A:
Obs    x     y    pai
1     b     1      1
2     a     1      1
3     b     9      2
4     a    10      2
5     b    11      3
6     a     6      3

排序后结果B:
Obs    x     y    pair
1     b    11      1
2     a    10      1
3     b     9      2
4     a     6      2
5     b     1      3
6     a     1      3


所以我觉得还应该引入个排队机制,如有限解决年纪大的,就按年龄递减排队进场,先解决最符合条件的大龄者。

想想这其实是个优化问题,还引发出了继续优化的问题,同等的条件下,还要要保证下一配对条件最接近,或者下下一配对最接近..。

如上面结果B的配对教A而言教优。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
13#
 楼主| 发表于 2010-7-12 21:35:52 | 只看该作者

Re: 如何分组?

是的,我现在的问题就是,如果有重复值出现,如何把已经产生最小值的一对去除,然后再对余下的进行配对。以此类推进行下去。
谢谢上面两位的solution and comment.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
14#
 楼主| 发表于 2010-7-12 21:53:48 | 只看该作者

Re: 如何分组?

to jingju11
you can try PROC FASTCLUS
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
15#
 楼主| 发表于 2010-7-18 11:38:59 | 只看该作者

Re: 如何分组?

谢谢hopewell。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 03:29 , Processed in 0.067219 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表