2014-09-28 2 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에도 적용되었습니다. 완전한 dataframe을 종으로 평균을 전가하고 유지하는 방법이/거기

답변

4

보십시오 : 대신 초기 데이터 세트 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를 사용할 수

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 

또는, 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

+0

@MYjx 'fun1'에서 보여준 것과 같이 별도의 함수로 사용할 수 있습니다. – akrun

관련 문제