R plyr, data.table, aplique determinadas colunas de data.frame

Estou procurando maneiras de acelerar meu código. Eu estou olhando para oapply/ply métodos, bem comodata.table. Infelizmente, estou com problemas.

Aqui está umpequeno dados de amostra:

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)

Aqui está uma solução usando loops:

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]])
} 

Eu olhei inicialmenteddply, mas alguns métodos que desejo usar apenas recebem vetores. Portanto, não consigo descobrir como fazerddply através de apenas algumas colunas, uma por uma.

Além disso, eu estive olhandolaply, mas quero devolver o originaldata.frame com as mudanças. Alguém pode me ajudar? Obrigado.

Com base nas sugestões anteriores, eis o que tentei usar noplyr pacote.

Opção 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)

Opção 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")

Opção 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")

Nada disso está me dando a resposta correta.

apply funciona muito bem, mas meus dados são muito grandes e as barras de progresso deplyr pacote seria muito bom. Obrigado novamente.

questionAnswers(6)

yourAnswerToTheQuestion