6.23.2 方案

    6.23.2.1 填充 NA 的函数

    1. fillNAgaps <- function(x, firstBack = FALSE) {
    2. ## 向量或因子中的 NA 被之前一个非 NA 值代替 如果
    3. ## firstBack 为 TRUE,将会对领头的 NA 填充第一个非 NA
    4. ## 值,否则不会
    5. ## 如果是一个因子,保存因子的水平,并转换为整数
    6. lvls <- NULL
    7. if (is.factor(x)) {
    8. lvls <- levels(x)
    9. x <- as.integer(x)
    10. }
    11. goodIdx <- !is.na(x)
    12. # 这些是来自于x的非NA值
    13. # 加入领头NA或者以第一个值代替,取决于firstBack参数
    14. if (firstBack)
    15. goodVals <- c(x[goodIdx][1], x[goodIdx]) else goodVals <- c(NA, x[goodIdx])
    16. # 这些补偿了goodVals。加1是为了避免索引为0
    17. fillIdx <- cumsum(goodIdx) + 1
    18. x <- goodVals[fillIdx]
    19. # 如果它最初是一个因子,那么将它转换回来
    20. if (!is.null(lvls)) {
    21. x <- factor(x, levels = seq_along(lvls), labels = lvls)
    22. }
    23. x
    24. }
    25. # 示例数据
    26. x <- c(NA, NA, "A", "A", "B", "B", "B", NA, NA, "C", NA,
    27. NA, NA, "A", "A", "B", NA, NA)
    28. x
    29. #> [1] NA NA "A" "A" "B" "B" "B" NA NA "C" NA NA
    30. fillNAgaps(x)
    31. #> [1] NA NA "A" "A" "B" "B" "B" "B" "B" "C" "C" "C"
    32. #> [13] "C" "A" "A" "B" "B" "B"
    33. # 对领头的 NA 以第一个非 NA 值进行填充
    34. fillNAgaps(x, firstBack = TRUE)
    35. #> [1] "A" "A" "A" "A" "B" "B" "B" "B" "B" "C" "C" "C"
    36. #> [13] "C" "A" "A" "B" "B" "B"
    37. # 因子数据也能使用
    38. y <- factor(x)
    39. y
    40. #> [1] <NA> <NA> A A B B B <NA> <NA> C
    41. #> [11] <NA> <NA> <NA> A A B <NA> <NA>
    42. #> Levels: A B C
    43. fillNAgaps(y)
    44. #> [1] <NA> <NA> A A B B B B B C
    45. #> [11] C C C A A B B B
    46. #> Levels: A B C

    6.23.2.2 注释