Mam regularnie sytuacje, w których muszę zastąpić brakujące wartości z data.frame wartościami z innych danych.frame, który jest na innym poziomie agregacji . Tak więc, na przykład, jeśli mam dane.frame pełne danych hrabstwa, mogę zastąpić wartości NA wartościami stanowymi przechowywanymi w innym data.frame. Po napisaniu tego samego merge
... ifelse(is.na())
Yada Yada kilkadziesiąt razy postanowiłem zepsuć i napisać funkcję, aby to zrobić.Tworzenie funkcji zastępującej NA z jednego data.frame wartościami z innej
Oto co ugotowane, wraz z przykładem, jak go używać:
fillNaDf <- function(naDf, fillDf, mergeCols, fillCols){
mergedDf <- merge(naDf, fillDf, by=mergeCols)
for (col in fillCols){
colWithNas <- mergedDf[[paste(col, "x", sep=".")]]
colWithOutNas <- mergedDf[[paste(col, "y", sep=".")]]
k <- which(is.na(colWithNas))
colWithNas[k] <- colWithOutNas[k]
mergedDf[col] <- colWithNas
mergedDf[[paste(col, "x", sep=".")]] <- NULL
mergedDf[[paste(col, "y", sep=".")]] <- NULL
}
return(mergedDf)
}
## test case
fillDf <- data.frame(a = c(1,2,1,2), b = c(3,3,4,4) ,f = c(100,200, 300, 400), g = c(11, 12, 13, 14))
naDf <- data.frame(a = sample(c(1,2), 100, rep=TRUE), b = sample(c(3,4), 100, rep=TRUE), f = sample(c(0,NA), 100, rep=TRUE), g = sample(c(0,NA), 200, rep=TRUE))
fillNaDf(naDf, fillDf, mergeCols=c("a","b"), fillCols=c("f","g"))
Więc po Dostałem ten bieg Miałam dziwne uczucie, że ktoś prawdopodobnie rozwiązać ten problem przede mną iw sposób o wiele bardziej elegancki sposób. Czy istnieje lepsze/łatwiejsze/szybsze rozwiązanie tego problemu? Czy istnieje sposób, który eliminuje pętlę w środku mojej funkcji? Ta pętla istnieje, ponieważ często wymieniam NA w więcej niż jednej kolumnie. I tak, funkcja przyjmuje, że kolumny, które wypełniamy, to: od są nazywane tymi samymi i kolumny, które wypełniają do i to samo dotyczy scalenia.
Pomocne będą wszelkie wskazówki lub refaktoryzacja.
EDIT gru 2 zrozumiał, że błędy logiczne w moim przykładzie której stała.
ochłodzić. Niektóre komentarze mogą mi pomóc w zrozumieniu tego. Wygląda zwięźle! :) –
OK - trochę to skomentowałem. Jeśli chcesz dowiedzieć się więcej, sekcja "Przykłady" na "# data.table" jest wzorcowa i warta jest około 20 minut pracy. Zwłaszcza jeśli jesteś wielkim facetem danych - i wygląda na to, że możesz być - to naprawdę warto zainwestować z góry. –
Dzięki Josh.To naprawdę pomocne. –