我經常會遇到這樣的情況,我需要用data.frame中的缺失值替換其他data.frame中的值,這些值位於不同級別的聚合。所以,舉例來說,如果我有一個充滿縣數據的data.frame,我可能會用存儲在另一個data.frame中的狀態值替換NA值。寫完之後merge
... ifelse(is.na())
yada yada幾十次我決定分解並編寫一個函數來做到這一點。創建一個函數,用一個data.frame中的NAs替換另一個data.frame中的值
這就是我與我如何使用它的一個例子熟了起來,沿着:
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"))
所以之後我得到這個運行我有這種奇怪的感覺,有人可能已經在我面前,並在解決了這個問題更優雅的方式。這個問題有更好/更簡單/更快的解決方案嗎?另外,有沒有一種方法可以消除函數中間的循環?那個循環在那裏,因爲我經常替換多個列中的NAs。而且,是的,該函數假定我們填寫的列從被命名爲相同,我們填充的列爲至,這同樣適用於合併。
任何指導或重構都會有幫助。
EDIT上12月02日我意識到邏輯缺陷在我的例子,我固定。
冷卻。一些評論可能會幫助我理解它。它看起來簡潔! :) –
好 - 我評論了一下。如果您有興趣瞭解更多信息,'?data.table'的'Examples'部分就是典範,值得花費20分鐘。特別是如果你是一個大數據傢伙 - 看起來你可能會這樣 - 它可能真的值得前期投資。 –
謝謝喬希。這真的很有幫助。 –