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.

Respuestas a la pregunta(6)

Su respuesta a la pregunta