使用dplyr按组更改变量值

时间:2014-09-28 04:38:58

标签: r dplyr

我的问题是我想将所有缺失值更改为多个列的每个组的平均值。我想使用dplyr,但它对我不起作用

例如

iris2 <- iris
set.seed(1)
iris2[-5] <- lapply(iris2[-5], function(x) {
  x[sample(length(x), sample(10, 1))] <- NA
  x
})

impute_missing=function(x){
    x[is.na(x)]=mean(x,na.rm=TRUE)
    return(x)
}

iris2 %>% groupby (Species) %>% sapply(impute_missing)

然而,代码并没有将物种的遗漏归咎于每个列的所有非缺失值的平均值。另一个奇怪的是该函数也被应用于Species组变量。是否有任何方法可以通过物种来估算均值并保留完整的数据框/

1 个答案:

答案 0 :(得分:4)

尝试:

 library(dplyr)
 iris2New <- iris2 %>% 
                   group_by(Species) %>%
                   mutate_each(funs(mean=mean(., na.rm=TRUE)), contains("."))

 iris2[,-5][is.na(iris2)[,-5]] <- iris2New[,-5][is.na(iris2)[,-5]]

 iris2

或者,您可以在初始数据集ifelse

上使用iris2
  fun1 <- function(x) ifelse(is.na(x), mean(x, na.rm=TRUE), x)
  iris3 <-  iris2 %>% 
                  group_by(Species) %>% 
                  mutate_each(funs(fun1), contains(".") )

  identical(as.data.frame(iris3), iris2)
  #[1] TRUE

或者,您可以使用

代替function
 iris4 <-  iris2 %>% 
                 group_by(Species) %>% 
                 mutate_each(funs(ifelse(is.na(.), mean(., na.rm=TRUE), .)), contains(".") )


 identical(iris3,iris4)
 #[1] TRUE