Как сделать переписать команду «sapply» для повышения производительности?

) У меня есть data.frame с именем "d" из ~ 1 300 000 строк и 4 столбцов и еще один data.frame с именем "gc" из ~ 12 000 строк и 2 столбца (но см. Меньший пример ниже).

d <- data.frame( gene=rep(c("a","b","c"),4), val=rnorm(12), ind=c( rep(rep("i1",3),2), rep(rep("i2",3),2) ), exp=c( rep("e1",3), rep("e2",3), rep("e1",3), rep("e2",3) ) )
gc <- data.frame( gene=c("a","b","c"), chr=c("c1","c2","c3") )

Вот как выглядит «d»:

   gene         val ind exp
1     a  1.38711902  i1  e1
2     b -0.25578496  i1  e1
3     c  0.49331256  i1  e1
4     a -1.38015272  i1  e2
5     b  1.46779219  i1  e2
6     c -0.84946320  i1  e2
7     a  0.01188061  i2  e1
8     b -0.13225808  i2  e1
9     c  0.16508404  i2  e1
10    a  0.70949804  i2  e2
11    b -0.64950167  i2  e2
12    c  0.12472479  i2  e2

А вот «gc»:

  gene chr
1    a  c1
2    b  c2
3    c  c3

Я хочу добавить 5-й столбец к «d» путем включения данных из "gc", которые совпадают с 1-м столбцом "d". На данный момент я использую sapply .

d$chr <- sapply( 1:nrow(d), function(x) gc[ gc$gene==d[x,1], ]$chr )

Но на реальных данных это занимает "очень много времени" ( Я запускаю команду с "system.time ()" более 30 минут, но она все еще не завершена).

Ты хоть представляешь, как я могу переписать это остроумно? Или мне стоит подумать об использовании plyr , может быть, с опцией «параллельный» (у меня на компьютере четыре ядра)? В таком случае, какой синтаксис лучше всего?

Заранее благодарим.

5
задан tflutre 14 March 2011 в 20:02
поделиться