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.