Skip to content

[R-es] Optimizar paste0()?

9 messages · Jorge I Velez, Javier Marcuzzi, Carlos Ortega +1 more

#
Hola a todos,

Me gustaria construir un vector a partir de otros dos.

Ejemplo:

x <- 1:3
y <- 4:6
d <- data.frame(x, y)
d$z <- with(d, paste0(x, ":", y, "-ABC"))
d

El problema es "d" tiene ~70 millones de filas y toma mucho tiempo
construir el vector "z".
Alguna sugerencia?

Muchas gracias,
Jorge Velez
#
Estimado Jorge Velez

¿Que pasa si usa sqldf que trabaja con sqlite o alguna conección a base 
de datos y realiza una concateneción en sql?

Javier Marcuzzi

El 09/12/2014 a las 09:46 a.m., Jorge I Velez escibió:
#
Gracias, Javier.

Los datos "d" corresponden un archivo de texto de ~1.92GB.   Voy a explorar
la posibilidad con sqldf, aunque confieso que mi conocimiento de SQL es
bastante limitado.

Saludos cordiales,
Jorge.-


2014-12-09 23:50 GMT+11:00 "Marcuzzi, Javier Rubén" <
javier.ruben.marcuzzi en gmail.com>:

  
  
#
Es semejante

library(sqldf)
x <- 1:3
y <- 4:6
d <- data.frame(x, y)
d$z <- with(d, paste0(x, ":", y, "-ABC"))
d

sqldf("select x, y, x || ':' || y || '-ABC' from d")


El 09/12/2014 a las 09:55 a.m., Jorge I Velez escibió:

  
  
#
Mejor
sqldf("select x, y, x || ':' || y || '-ABC' as z from d")

El 09/12/2014 a las 09:55 a.m., Jorge I Velez escibió:

  
  
#
Hola,

Otra forma, quizás algo más rápida, especialmente para unos conjuntos tan
grandes, que la de sqldf es "data.table":

library(data.table)
x <- 1:3
y <- 4:6
d <- data.table(x, y)
d[,z := paste(x,"-",y,sep="")]
x y   z
1: 1 4 1-4
2: 2 5 2-5
3: 3 6 3-6

Y bueno, "dplyr" también es otra opción muy rápida...
También, y recuerdo que hace tiempo también lo llegamos a hablar, existe la
posibilidad de juntar las dos variables por fuera ejecutando un comando en
la shell del Sistema Operativo (supongo que es Uniux/Linux)con "system()".

Saludos,
Carlos Ortega
www.qualityexcellence.es

Saludos,
Carlos Ortega


El 9 de diciembre de 2014, 14:13, "Marcuzzi, Javier Rubén" <
javier.ruben.marcuzzi en gmail.com> escribió:

  
    
#
Jorge

Creo que la opción de Carlos Ortega es mejor, si no recuerdo mal una vez 
vi una demostración sobre bigdata en la cual data.table tenía una 
performance que sorprendía sobre otras alternativas.

Javier Marcuzzi


El 09/12/2014 a las 12:35 p.m., Carlos Ortega escibió:

  
  
#
Hola, ¿qué tal?

Algunos números:
user  system elapsed
 17.289   0.264  17.552
user  system elapsed
 48.875   0.632  49.506
user  system elapsed
 48.255   0.588  48.842

Por debajo del minuto. Pero con 24GB de RAM, que es, diría, el factor
limitante. De hecho,
560124840 bytes

que es alrededor de medio GB.

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com



El día 9 de diciembre de 2014, 17:12, "Marcuzzi, Javier Rubén"
<javier.ruben.marcuzzi en gmail.com> escribió:
#
Muchas gracias a todos por las sugerencias.  Finalmente reinicie la maquina
y pude ejecutar el ejemplo de Carlos Gil en un tiempo "equivalente":

R> a <- sample(letters, 70e6, replace = T)
R> b <- sample(letters, 70e6, replace = T)
R> system.time(a.b <- paste0(a, ":", b, "-SNV"))
   user  system elapsed
 23.255   0.150  23.423
R> b <- sample(1:100, 70e6, replace = T)
R> system.time(a.b <- paste0(a, ":", b, "-SNV"))
   user  system elapsed
 38.226   0.291  38.549

En cuanto a mi "problema", con la ayuda de alguien aqui en la escuela
terminamos utilizando

JCSMR022175:~ velezjo$  grep -E '\trs\d+\t' input.txt | perl -lne '@a =
split("\t", $_); $a[3] =~ s/-//g; @b = split(/\//,$a[3]); print
"$a[2]\t$a[0]:$a[1]-SNV\t$b[0]\t".join("/", @b[1..$#b]);' > output.txt

Saludos cordiales,
Jorge.-



2014-12-10 2:35 GMT+11:00 Carlos Ortega <cof en qualityexcellence.es>: