我试图了解如何在不使用循环的情况下条件替换数据帧中的值.我的数据框架结构如下:
> df
a b est
1 11.77000 2 0
2 10.90000 3 0
3 10.32000 2 0
4 10.96000 0 0
5 9.90600 0 0
6 10.70000 0 0
7 11.43000 1 0
8 11.41000 2 0
9 10.48512 4 0
10 11.19000 0 0
Run Code Online (Sandbox Code Playgroud)
和dput
输出是这样的:
structure(list(a = c(11.77, 10.9, 10.32, 10.96, 9.906, 10.7,
11.43, 11.41, 10.48512, 11.19), b = c(2, 3, 2, 0, 0, 0, 1, 2,
4, 0), est = c(0, 0, 0, 0, 0, …
Run Code Online (Sandbox Code Playgroud) 我经常遇到需要从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)) …
Run Code Online (Sandbox Code Playgroud)