R plyr, data.table, aplica ciertas columnas de data.frame
Estoy buscando maneras de acelerar mi código. Estoy buscando en elapply
/ply
métodos así comodata.table
. Desafortunadamente, estoy teniendo problemas.
Aquí hay unpequeña Data de muestra:
ids1 <- c(1, 1, 1, 1, 2, 2, 2, 2)
ids2 <- c(1, 2, 3, 4, 1, 2, 3, 4)
chars1 <- c("aa", " bb ", "__cc__", "dd ", "__ee", NA,NA, "n/a")
chars2 <- c("vv", "_ ww_", " xx ", "yy__", " zz", NA, "n/a", "n/a")
data <- data.frame(col1 = ids1, col2 = ids2,
col3 = chars1, col4 = chars2,
stringsAsFactors = FALSE)
Aquí hay una solución usando bucles:
library("plyr")
cols_to_fix <- c("col3","col4")
for (i in 1:length(cols_to_fix)) {
data[,cols_to_fix[i]] <- gsub("_", "", data[,cols_to_fix[i]])
data[,cols_to_fix[i]] <- gsub(" ", "", data[,cols_to_fix[i]])
data[,cols_to_fix[i]] <- ifelse(data[,cols_to_fix[i]]=="n/a", NA, data[,cols_to_fix[i]])
}
Inicialmente miréddply
, pero algunos métodos que quiero usar solo toman vectores. Por lo tanto, no puedo averiguar cómo hacerloddply
a través de ciertas columnas una por una.
Además, he estado mirandolaply
, pero quiero devolver el originaldata.frame
Con los cambios. ¿Alguien puede ayudarme? Gracias.
Basándome en las sugerencias anteriores, esto es lo que intenté usar de laplyr
paquete.
Opción 1:
data[,cols_to_fix] <- aaply(data[,cols_to_fix],2, function(x){
x <- gsub("_", "", x,perl=TRUE)
x <- gsub(" ", "", x,perl=TRUE)
x <- ifelse(x=="n/a", NA, x)
},.progress = "text",.drop = FALSE)
Opcion 2:
data[,cols_to_fix] <- alply(data[,cols_to_fix],2, function(x){
x <- gsub("_", "", x,perl=TRUE)
x <- gsub(" ", "", x,perl=TRUE)
x <- ifelse(x=="n/a", NA, x)
},.progress = "text")
Opción 3:
data[,cols_to_fix] <- adply(data[,cols_to_fix],2, function(x){
x <- gsub("_", "", x,perl=TRUE)
x <- gsub(" ", "", x,perl=TRUE)
x <- ifelse(x=="n/a", NA, x)
},.progress = "text")
Ninguno de estos me está dando la respuesta correcta.
apply
Funciona muy bien, pero mis datos son muy grandes y las barras de progreso deplyr
El paquete sería muy bonito. Gracias de nuevo.