[R-es] Ayuda por data.table.
Javier Villacampa González
javier.villacampa.gonzalez en gmail.com
Jue Oct 1 16:05:25 CEST 2015
Hola buenas,
hoy me preguntaban que como convertir todas las mayusculas de todas las
columnas de un data.frame. Buscando soluciones me han surgido multiples
dudas.
###########################
Pregunta 1: ¿Cómo funciona := respocto <-?
¿por qué cambia en varios data tables un valor mienstras que el otro no lo
hace?
¿Se puede evitar?
###########################
N <- 10 # numero de checks
n <- 10
DF <- data.frame(V1 = sample(x = letters, size = n, replace = T) ,
V2 = sample(x = letters, size = n, replace = T) ,
stringsAsFactors = F)
# 1 asginacion clásica ----------------------------------------------------
DT <- DF %>% data.table()
DT2 <- DT
DT2$V1 <- DT2$V1 %>% toupper
DT2
DT # Todo Ok
# 2 con := ----------------------------------------------------------------
DT <- DF %>% data.table()
DT2 <- DT
DT2[ , V1 := V1 %>% toupper]
DT2
DT # Cambia ambos ¿Por qué?
###########################
Pregunta 2: Soluciones para convertir todas las columnas a mayusculas
¿Existen otras mejores? ¿Por qué la asignación base sale la mejor cuando
los bucles deberían ser la peor opcion?
###########################
library(dplyr)
library(data.table)
library(microbenchmark)
N <- 100
n <- 10
dt <- data.table(sample(x = letters, size = n, replace = T) ,
sample(x = letters, size = n, replace = T) )
# Opcion 1a sapply
sapply(X = dt,FUN = toupper)
# Opcion 1b lapply
lapply(X = dt,FUN = toupper) %>% data.frame
# Opcion 1c lapply
apply(X = dt, MARGIN = 2,FUN = toupper)
# ------------------------------------------------------------------------
# Opcion 2 data table. Más rapido cuando los conjuntos son grandes
NAMES <- names(dt)
dt2 <-dt
dt[ , (NAMES) := lapply(X = .SD, FUN = toupper), .SDcol = NAMES]
dt <- dt2
# Opcion 3 data table. Más rapido cuando los conjuntos son grandes
dt %>% mutate_each(funs = funs(toupper) )
# ------------------------------------------------------------------------
# Comparaciones C
N <- 100 # numero de checks
n <- 10e5
DF <- data.frame(V1 = sample(x = letters, size = n, replace = T) ,
V2 = sample(x = letters, size = n, replace = T) ,
stringsAsFactors = F)
DT <- data.table(DF)
NAMES <- names(DF)
times <- microbenchmark(
sapply = DF2 <- sapply(X = DF,FUN = toupper) ,
lapply = DF2 <- lapply(X = DF,FUN = toupper) %>% data.frame,
apply = DF2 <- apply(X = DF, MARGIN = 2,FUN = toupper),
dplyr = DF %>% mutate_each(funs = funs(toupper) ) ,
data.table =
DT[ , (NAMES) := lapply(X = .SD, FUN = toupper), .SDcol = NAMES] ,
basicFOR = {
for(i in 1: ncol(DF)){
DF[ , i ] <- DF[ , i ] %>% toupper
}
},
data.tableFOR = {
for(i in names(DT)){
DT[ , V1 := V1 %>% toupper]
DT[ , V2 := V2 %>% toupper]
}
},
times = N, unit = "s")
times %>% print -> times2
times2[ order(times2$median, decreasing = F), ]
# > times2[ order(times2$median, decreasing = F), ]
# expr min lq mean median uq max neval
cld
# 4 dplyr 0.1492257 0.1694823 0.2155098 0.2037122 0.2288146
0.4119565 100 ab
# 6 basicFOR 0.1498588 0.1715156 0.2099023 0.2052561 0.2294035
0.4420238 100 a
# 5 data.table 0.1560987 0.1701567 0.2322289 0.2194231 0.2690364
0.4829464 100 ab
# 2 lapply 0.2239878 0.2565161 0.3288909 0.3034968 0.3578117
0.6619332 100 bc
# 3 apply 0.2396120 0.2809439 0.3578056 0.3280944 0.4196089
0.6453446 100 c
# 7 data.tableFOR 0.3176318 0.3719481 0.4798864 0.4782654 0.5695964
0.8311082 100 d
# 1 sapply 1.2189397 1.4028805 2.1926634 2.4061735 2.6853981
4.8600199 100 e
--
[[alternative HTML version deleted]]
Más información sobre la lista de distribución R-help-es