R中多列的条件均值

我的数据是这个

train <- data.frame(y=c(1,2,1,1),x1=c(2,4,NA,5),x2=c(8,6,12))

我需要用该列的平均值替换每个x变量的缺失值(NA),但是平均值必须使用该x变量的值进行计算,该x变量的对应y值等于该行的y值缺失的价值。

例如:在x1列的NA所在的行中,y值等于1,因此该缺失值应替换为2到5之间的平均值(这是y为x的x1值)也是1)。

我的代码是这样的,但均值不是有条件的:

for(i in 1:ncol(train)){
  train[is.na(train[,i]),i] <- mean(train[,i],na.rm = TRUE)
}
liuqinjian 回答:R中多列的条件均值

library(dplyr)
train %>%
    group_by(y) %>%
    mutate_at(vars(-y),function(v){
        if_else(is.na(v),mean(v,na.rm = TRUE),v)
    }) %>%
    ungroup()
## A tibble: 4 x 3
#      y    x1    x2
#  <dbl> <dbl> <dbl>
#1     1   2       8
#2     2   4     NaN
#3     1   3.5     6
#4     1   5      12
,

按“ y”列分组后,我们可以使用na.aggregate

library(dplyr)
library(zoo)
train %>%
  group_by(y) %>%
   mutate_at(vars(-one_of(group_vars(.))),~if(all(is.na(.))) NA_real_ else na.aggregate(.))
# A tibble: 4 x 3
# Groups:   y [2]
#      y    x1    x2
#  <dbl> <dbl> <dbl>
#1     1   2       8
#2     2   4      NA
#3     1   3.5     6
#4     1   5      12

或在基于{y1列} na.aggregate将数据集放入splitlist中的data.frame后应用train[-1] <- unsplit(lapply(split(train[-1],train$y),na.aggregate),train$y)

-k
,

请考虑使用ave来确定是否将ifelse的条件包裹在NA中的分组平均值:

# ITERATE THROUGH ALL COLUMNS BUT FIRST
for(i in c("x1","x2")) {    
    train[[i]] <- ifelse(test = is.na(train[[i]]),yes = ave(train[[i]],train$y,FUN=function(x) mean(x,na.rm=TRUE)),no = train[[i]])
}

train   
#   y  x1  x2
# 1 1 2.0   8
# 2 2 4.0 NaN
# 3 1 3.5   6
# 4 1 5.0  12
本文链接:https://www.f2er.com/3156507.html

大家都在问