2014-09-28 68 views
4

我的問題是我想要將所有缺失值更改爲多個列的每個組的平均值。我想用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組變量。有什麼辦法歸咎於受種的均值和保持一個完整的數據幀/

回答

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 

或者,你可以在初始數據集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 

或者使用ifelse,而不是的function,你可以使用

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


identical(iris3,iris4) 
#[1] TRUE 
+0

真棒!謝謝你的幫助!但是我對'funs'部分有個問題,我們不能包含'function(x){}'但是使用'.'? – MYjx 2014-09-28 15:50:10

+0

@MYjx你可以使用它作爲一個獨立的函數,就像我在'fun1'中展示的那樣 – akrun 2014-09-28 16:29:15