【问题标题】:Replace missing value with mean of class within column用列内类的平均值替换缺失值
【发布时间】:2020-08-15 12:01:02
【问题描述】:

我有一个包含一些缺失值 (NA) 的大型数据集。我希望将这些值替换为列均值,但按类,也就是说,如果类 k 中的项目在列 j 中有缺失值,则该值将被替换为J 列 k 类中的项目。 此外,我只想使用基本 R 或 dplyr 来执行此操作。

与这里已经回答的众所周知的问题相比,类方面带来了一个额外的问题:Replace missing values with column mean。

事实上,我可以将其中的一种解决方案改编成一个笨拙的解决方案来解决我的问题:

NA2mean <- function(x){replace(x, is.na(x), mean(x, na.rm = TRUE))}
DF %>% filter(DF$class=="A") -> A
A <- lapply(A,NA2mean)

(其中数据框为 DF,我假设因子存储在“类”列中。)

然后你会为其他每个班级(例如 B、C、D、E、F)重复此操作。最后,您可以使用 DF

在我的例子中,数据框是按类排序的(即首先是 A,然后是 B,然后是 C,...),我想保持这种方式。

有什么方法可以更有效地做到这一点?

【问题讨论】:

    标签: r dplyr multiple-columns factors


    【解决方案1】:

    我们可以从zoo使用na.aggregate

    library(dplyr)
    library(zoo)
    DF %>%
      group_by(class) %>%
      mutate_at(vars(-group_cols()), na.aggregate)
    

    如果我们需要base R

    nm1 <- setdiff(names(DF), "class")
    DF[nm1] <- lapply(DF[nm1], function(vec) ave(vec, class, FUN = NA2mean))
    

    【讨论】:

    • 感谢您的回复,但我只要求 base R 和 dplyr。
    • @MobeusZoom na.aggregate 通过替换为 mean 来自动更改 NA
    【解决方案2】:

    基础 R 解决方案:

    df[, sapply(df, is.numeric)] <-
      do.call("rbind", lapply(split(df[, sapply(df, is.numeric)], df$class), function(x) {
        x <- ifelse(is.na(x), mean(x, na.rm = TRUE), x)
      }))
    

    【讨论】:

    • 谢谢!不错的解决方案
    【解决方案3】:

    使用dplyr,您可以group_by Class 并为每一列应用NA2mean。

    library(dplyr)
    DF %>% group_by(class) %>% mutate_all(NA2mean)
    

    在较新版本的dplyr中,您可以这样做across

    DF %>% group_by(class) %>% mutate(across(everything(), NA2mean))
    

    【讨论】:

    • 谢谢!最简单的好解决方案,你给了其中两个。
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2018-12-27
    • 1970-01-01
    • 2017-02-24
    • 2013-09-07
    相关资源
    最近更新 更多