R plyr, data.table, zastosuj pewne kolumny data.frame

Szukam sposobów na przyspieszenie mojego kodu. Patrzę wapply/ply metody, jak równieżdata.table. Niestety, mam problemy.

Tutaj jestmały przykładowe dane:

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)

Oto rozwiązanie wykorzystujące pętle:

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

Początkowo spojrzałemddply, ale niektóre metody, których chcę używać, to tylko wektory. Dlatego nie mogę wymyślić, jak to zrobićddply tylko w niektórych kolumnach jeden po drugim.

Również patrzyłem nalaply, ale chcę zwrócić oryginałdata.frame ze zmianami. Czy ktoś może mi pomóc? Dziękuję Ci.

W oparciu o sugestie z wcześniejszego, oto co próbowałem użyć zplyr pakiet.

Opcja 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)

Opcja 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")

Opcja 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")

Żadna z nich nie daje mi poprawnej odpowiedzi.

apply działa świetnie, ale moje dane są bardzo duże, a paski postępu zplyr pakiet byłby bardzo miły. Dzięki jeszcze raz.

questionAnswers(6)

yourAnswerToTheQuestion