Tengo un data.frame llamado "d" de ~ 1,300,000 líneas y 4 columnas y otro data.frame llamado "gc" de ~ 12,000 líneas y 2 columnas (pero vea el ejemplo más pequeño a continuación).¿Cómo volver a escribir un comando "sapply" para aumentar el rendimiento?
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"))
Aquí es cómo "d" se parece a:
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
Y aquí es "GC":
gene chr
1 a c1
2 b c2
3 c c3
Quiero añadir una quinta columna para "d" mediante la incorporación datos de "gc" que coinciden con la primera columna de "d". Por el momento estoy usando sapply.
d$chr <- sapply(1:nrow(d), function(x) gc[ gc$gene==d[x,1], ]$chr)
Pero en los datos reales, se necesita un tiempo "muy largo" (Estoy funcionando con el comando "system.time()" desde hace más de 30 minutos y todavía no ha terminado).
¿Tiene alguna idea de cómo podría volver a escribir esto de una manera inteligente? ¿O debería considerar usar plyr, tal vez con la opción "paralelo" (tengo cuatro núcleos en mi computadora)? En tal caso, ¿cuál sería la mejor sintaxis?
Gracias de antemano.
Gracias, eso es exactamente lo que necesito . – tflutre
+1 Eso es brillante, no sabía que eso fuera posible. –
Yo ni tbh :) Pero hay una trampa. Es decir que gc [, 1] aquí debe ser exactamente el mismo factor que d [, 1], tener solo una fila para cada nivel y cada nivel debe estar en el mismo orden.El truco es que un factor corresponde numéricamente a 1,2 ... –