2017-02-12 16 views
0

데이터 프레임 x1의 여러 열에서 NA 값을 일반 및 고유 한 특성 'ID'에 따라 x2 및 x3 데이터 프레임의 값의 평균으로 대체하려고합니다. 내가 this post에 감사를 한 번에 1 열을 위해 그것을 할 수있는 대답을 발견여러 열의 NA를 다른 데이터 프레임의 평균값으로 바꿉니다.

ID A B C ..... 

01 2 5 7 ..... 
02 NA NA NA ..... 
03 5 4 8 ..... 

:

모든 dataframes (각 dataframe는 특정 연도입니다) 동일한 열 구조를 가지고있다.

x1$A[is.na(x1$A)] <- (x2$A[match(x1$ID[is.na(x1$A)],x2$ID)] + x3$A[match(x1$ID[is.na(x1$A)],x3$ID)])/2 

그러나 저는 이것을 적용하기 위해 약 100 개의 coulmns가 있기 때문에이를 수행하는 더 똑똑한 방법을 갖고 싶습니다. 나는 this posthere에서 제안을 시도했다. 이 코드를 만들었지 만 작동시키지 못했습니다.

x1[6:105] = as.data.frame(lapply(x1[6:105], function(x) ifelse(is.na(x), (x2$x[match(x1$ID, x2$ID)]+x3$x[match(x1$ID, x3$ID)])/2, x1$x))) 

다음 오류 얻었다 : I가 초기 열 전체에 근무 X는 열 이름을 나타내는 함수 (x)를 생각

Error in ifelse(is.na(x), (x2$x[match(x1$ID, x2$ID)] + x3$x[match(x1$ID, : replacement has length zero 

을하지만은 각 셀 값을 나타낸다 생각 즉 왜 일하지 않을거야.

저는 R에서 초보자입니다. 논리가 여러 열에 적용될 때 내가 잘못 가고있는 부분을 알려 주시면 감사하겠습니다.

+0

이것은 아마도 오류의 원인이되지 않지만'ifelse'의 마지막 인수는'x1 $ x'보다는 x이어야합니다. – lmo

답변

0
for (i in 1:ncol(x1)) { 
    nas <- is.na(x1[,i]) # where are NAs 
    if (sum(nas)==0) next 
    ids <- x1$ID[nas] # ids of NAs 
    nam <- colnames(x1)[i] # colname of the column 
    x1[nas, i] <- (x2[match(ids, x2$zip), nam] + x3[match(ids, x3$zip), nam])/2 
}