У меня регулярно возникают ситуации, когда мне нужно заменить отсутствующие значения в data.frame значениями из какого-либо другого data.frame, который находится на другом уровне агрегации.Так, например, если у меня есть data.frame, полный данных округа, я мог бы заменить значения NA значениями состояния, хранящимися в другом data.frame.После того, как несколько десятков раз написал одну и ту же merge
... ifelse(is.na())
yada yada, я решил сломать и написать для этого функцию.
Вот что я приготовил вместе с примером того, как я его использую:
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") )
Так что после того, как я запустился, у меня возникло странное ощущение, что кто-то, вероятно, решил эту проблему раньшея и гораздо более элегантно.Есть ли лучшее / более легкое / быстрое решение этой проблемы?Кроме того, есть ли способ, который устраняет цикл в середине моей функции?Этот цикл существует, потому что я часто заменяю NA в более чем одном столбце.И да, функция предполагает, что столбцы, которые мы заполняем из , имеют одинаковые имена, и столбцы, которые мы заполняем до , и то же самое относится к объединению.
Любое руководство или рефакторинг будет полезным.
РЕДАКТИРОВАТЬ 2 декабря Я понял, что в моем примере у меня были недостатки логики, которые я исправил.