先随便生成点数据:
<br />
> (label=data.frame(id=sample(1:10*1234),a=sprintf("a%d",1:10)))<br />
id a<br />
1 6170 a1<br />
2 4936 a2<br />
3 9872 a3<br />
4 3702 a4<br />
5 2468 a5<br />
6 11106 a6<br />
7 7404 a7<br />
8 1234 a8<br />
9 12340 a9<br />
10 8638 a10<br />
> (query.id=sample(sample(10,5)*1234,6,replace=T))<br />
[1] 12340 9872 12340 4936 12340 9872<br />
问题:想找到label中和query.id对应的a的值。
一种(优点偷懒的)方案:
<br />
> (qid.fct=factor(query.id,levels=label$id))<br />
[1] 12340 9872 12340 4936 12340 9872 <br />
Levels: 6170 4936 9872 3702 2468 11106 7404 1234 12340 8638<br />
> <br />
> data.frame(query.id,label[qid.fct,])<br />
query.id id a<br />
9 12340 12340 a9<br />
3 9872 9872 a3<br />
9.1 12340 12340 a9<br />
2 4936 4936 a2<br />
9.2 12340 12340 a9<br />
3.1 9872 9872 a3<br />
工作原理:很简单,factor本身就是有levels的一个vector,它的值就已经是index了(详见R-intro/R-lang),当query.id很长的时候,这种办法似乎还是很快的:
<br />
> unclass(qid.fct)<br />
[1] 9 3 9 2 9 3<br />
attr(,"levels")<br />
[1] "6170" "4936" "9872" "3702" "2468" "11106" "7404" "1234" "12340" "8638" <br />
其实用更底层的match应该可以更快一点的。所以这个方法的主要用途在于程序中已经计算过factor的情况下,可以直接拿来做下标,而不用重新再match一遍。