将缺失的数值替换为列内类的平均值

问题描述 投票:0回答:1

我有一个大型数据集,其中有一些缺失值(NAs)。我想用列均值来替换这些值,但是 按类也就是说,如果k类中的项目在j列中有一个缺失的值,该值将被J列中的平均值所取代。为k类的项目。 此外,我想只用base R或dplyr来做这件事。

与这里已经回答过的众所周知的问题相比,类方面又带来了一个问题。用列均值代替缺失值.

事实上,我可以把那里的一个解决方案改编成我的问题的一个笨拙的解决方案。

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 <- rbind(A,B,C,D,E,F)来用修正后的数据框替换你的旧数据框。

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

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

r dplyr multiple-columns factors
1个回答
0
投票

使用 dplyr,你可以 group_by Class 并应用 NA2mean 的每一列。

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

在新版本的 dplyr你可以这样做 across

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

1
投票

基础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)
  }))

1
投票

我们可以用 na.aggregatezoo

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))
© www.soinside.com 2019 - 2024. All rights reserved.