6.23.2 方案
6.23.2.1 填充 NA 的函数
fillNAgaps <- function(x, firstBack = FALSE) {
## 向量或因子中的 NA 被之前一个非 NA 值代替 如果
## firstBack 为 TRUE,将会对领头的 NA 填充第一个非 NA
## 值,否则不会
## 如果是一个因子,保存因子的水平,并转换为整数
lvls <- NULL
if (is.factor(x)) {
lvls <- levels(x)
x <- as.integer(x)
}
goodIdx <- !is.na(x)
# 这些是来自于x的非NA值
# 加入领头NA或者以第一个值代替,取决于firstBack参数
if (firstBack)
goodVals <- c(x[goodIdx][1], x[goodIdx]) else goodVals <- c(NA, x[goodIdx])
# 这些补偿了goodVals。加1是为了避免索引为0
fillIdx <- cumsum(goodIdx) + 1
x <- goodVals[fillIdx]
# 如果它最初是一个因子,那么将它转换回来
if (!is.null(lvls)) {
x <- factor(x, levels = seq_along(lvls), labels = lvls)
}
x
}
# 示例数据
x <- c(NA, NA, "A", "A", "B", "B", "B", NA, NA, "C", NA,
NA, NA, "A", "A", "B", NA, NA)
x
#> [1] NA NA "A" "A" "B" "B" "B" NA NA "C" NA NA
fillNAgaps(x)
#> [1] NA NA "A" "A" "B" "B" "B" "B" "B" "C" "C" "C"
#> [13] "C" "A" "A" "B" "B" "B"
# 对领头的 NA 以第一个非 NA 值进行填充
fillNAgaps(x, firstBack = TRUE)
#> [1] "A" "A" "A" "A" "B" "B" "B" "B" "B" "C" "C" "C"
#> [13] "C" "A" "A" "B" "B" "B"
# 因子数据也能使用
y <- factor(x)
y
#> [1] <NA> <NA> A A B B B <NA> <NA> C
#> [11] <NA> <NA> <NA> A A B <NA> <NA>
#> Levels: A B C
fillNAgaps(y)
#> [1] <NA> <NA> A A B B B B B C
#> [11] C C C A A B B B
#> Levels: A B C
6.23.2.2 注释