2017-09-27 21 views
0

그룹을 기준으로 누락 값을 대체하려고합니다. median() 함수에 숫자 데이터가 필요하다는 오류가 발생하지만 모든 데이터가 숫자이므로 문제가 표시되지 않습니다. 여기에 최소한으로 재현 할 수있는 예제가 있습니다.중간 교체, 숫자 데이터 필요

set.seed(123) 
cluster = sample(seq(1,10),1000,replace=TRUE) 
V1 = sample(c(runif(100),NA),1000,replace=TRUE) 
V2 = sample(c(runif(100),NA),1000,replace=TRUE) 

df = as.data.frame(cbind(cluster,V1,V2)) 

df_fixed = by(df,df$cluster,function(x){replace(x,is.na(x),median(x, na.rm=TRUE))}) 

오류가 반환 :

median.default (X, na.rm = TRUE) 오류 : 필요한 숫자 데이터

이 코드는, 그래서 비록 작동합니다 중간 값 함수에 문제가 있습니다.

df_fixed = by(df,df$cluster,function(x){replace(x,is.na(x),1)}) 
+0

사용하세요 'set.seed' 이러한 있도록 등 sample' runif',' '등의 기능을 사용하여 재현 – Sotos

+2

'by' 작은 data.frames DF로 절단한다 - 아니다 클래스 숫자. 열 단위 중위수 또는 전반적인 중앙값으로 바꾸시겠습니까? –

+0

나는 각 그룹에 대해 열 현명한 중앙값을 대체하려고합니다. 따라서 그룹 1에 있고 누락 된 경우 그룹 1의 중간 값으로 대체하십시오. – user137698

답변

1
df_fixed <- apply(df[,2:3], 2, function(x) { 
    md <- sapply(sort(unique(df$cluster)), function(k) median(x[df$cluster==k], na.rm=TRUE)) 
    x[is.na(x)] <- md[df$cluster][is.na(x)] 
    return(x) 
}) 

any(is.na(df_fixed)) 
# [1] FALSE 
+0

이 코드는 모든 그룹에 누락 값이있는 경우 작동합니다. 내 실제 데이터에서 누락 된 값이없는 그룹이있는 경우 어떤 이유로 든 대체 된 데이터가 없습니다. 그냥이 열을 건너 뜁니다. 더미 데이터로 이것을 재현 할 수 없으므로 아이디어가 없으면 해결책을 생각해야합니다. – user137698

+0

@ user137698 코드를 변경했습니다. 이제 누락 된 값이없는 열에서도 작동합니다. 시도하고 알려주세요. –