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.