2016-12-14 7 views
1

이상한 문제가 있습니다. 좋은 해결책을 찾을 수 없었습니다. 기본적으로 우리 시스템은 사람들을위한 점수를 출력합니다. 보통은 처음 시스템에있을 때만입니다. 그러나 때로는 시스템에 두 번째로 점수를 입력하고 경우에 따라 모든 행을 채 웁니다. 데이터베이스를 수정하는 것이 이상적 일지 모르지만 그것은 일어나지 않을 것입니다 (감사 관리). 또한 중복 된 ID 값은 이유 때문에 복제되므로 제거 할 수 없습니다. 내가해야 할 일은 스코어를 모든 일치하는 ID 값에 대해 NA가있는 필드로 복사하는 것입니다. 그래서, 여기에 데이터의 예는 다음과 같습니다동일한 데이터 프레임에서 일치하는 ID 값을 가진 행을 덮어 씁니다.

ID VAR1 VAR2 VAR3 VAR4 VAR5 
1 16 15 14 15 46 
1 NA NA NA NA NA 
2 15 12 11 14 12 
3 14 12 12 15 22 
3 14 12 12 15 22 
4 NA NA NA NA NA 
4 11 04 12 33 12 
6 NA NA NA NA NA 

이 출력은

ID VAR1 VAR2 VAR3 VAR4 VAR5 
1 16 15 14 15 46 
1 16 15 14 15 46 
2 15 12 11 14 12 
3 14 12 12 15 22 
3 14 12 12 15 22 
4 11 04 12 33 12 
4 11 04 12 33 12 
6 NA NA NA NA NA 

과 같을 것이다 나는 내 책상 떨어져 그것을 이동하기 위해이 문제에 대한 작업 뭔가를 얻을 수 있었다, 그러나이 문제는 것입니다 재발견하고 더 나은 해결책을 원합니다. 내 솔루션은 다음과 같습니다

df_2 <- list() 
for(i in df$ID){ 
    filter(df, ID == i) %>% 
    mutate(VAR1 = mean(VAR1, na.rm = TRUE), 
      VAR2 = mean(VAR2, na.rm = TRUE), 
      VAR3 = mean(VAR3, na.rm = TRUE), 
      VAR4 = mean(VAR4, na.rm = TRUE), 
      VAR5 = mean(VAR5, na.rm = TRUE)) 
} -> df_2[[i]] 

# Then we bind this together as a dataframe 
bind_rows(df_2) -> df_replaced 

# Remove the list object as it's huge 
rm(df_2) 

이 작동하지만, 약 천 년이 걸린다 4 기가 (df_2) 주위 임시 목록을 만듭니다. 그래서 시스템을 완전히 정지시켜 가능한 한 빨리 제거해야하는 이유입니다. 일치하는 항목이있는 것처럼 느껴지지만 NA 행을 복사하는 데 데이터 행을 지능적으로 선택하는 방법을 잘 모르겠습니다.

편집 : 표 형식이 고정되어 있습니다.

답변

1

여기에는 is.namatch을 사용하여 채우기 및 채우기에 사용할 지표를 선택하는 기본 R 방법이 있습니다. 여기

df 
    ID VAR1 VAR2 VAR3 VAR4 VAR5 
1 1 16 15 14 15 46 
2 1 16 15 14 15 46 
3 2 15 12 11 14 12 
4 3 14 12 12 15 22 
5 3 14 12 12 15 22 
6 4 11 4 12 33 12 
7 4 11 4 12 33 12 
8 6 NA NA NA NA NA 

트릭 반환

df[is.na(df$VAR1), -1] <- df[match(df$ID[is.na(df$VAR1)], 
            df$ID[ifelse(!is.na(df$VAR1), TRUE, NA)]), -1] 

는 data.frame의 행수와 동일한 길이 테이블 (match 두 번째 인자)를 호출하는 ifelse을 사용하는 것이다.

관련 문제