我经常会遇到这样的情况,我需要用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分钟。特别是如果你是一个大数据家伙 - 看起来你可能会这样 - 它可能真的值得前期投资。 –
谢谢乔希。这真的很有帮助。 –