2014-12-13 5 views
1

이 같은 데이터를 구비하고 :R : NA가 아닌 경우 가장 가까운 이웃이라고 할 수 있습니까?

v1 = c(-1, 1, 420, 400, 400, 170, 420) 
v2 = c(350, 460, 420, 400, 500, 170, 420) 
v3 = c(350, 460, 420, 1, 500, 3, 1) 
v4 = c(1, NA, 420, 1, NA, 170, 420) 
v5 = c(350, 400, 400, 1, 1, 3, 300) 
v6 = c(350, 400, NA, 500, 500, 170, 300) 
v7 = c(7,400,200,7,500,170,7) 

DF1= data.frame(v1, v2, v3, v4, v5, v6, v7) 

테이블의 생성/DF는 다음과 같이

v1 v2 v3 v4 v5 v6 v7 
1 -1 350 350 1 350 350 7 
2 1 460 460 NA 400 400 400 
3 420 420 420 420 400 NA 200 
4 400 400 1 1 1 500 7 
5 400 500 500 NA 1 500 500 
6 170 170 3 170 3 170 170 
7 420 420 1 420 300 300 7 

3 개 자리 숫자는 사용 시간 (400 = 40H) 및 한 자리는 상태이다 아르 고용의. 데이터의 문제점은 월별 정보 (v1-v7은 몇 달)를 목표로하고 있지만 1 년에 한 번만 설문 조사를합니다. 그래서 나는 그것을 국가에 놓았고 지금은 채우기 위해 같은 공백이 있습니다.

상태 "-1", "NA", "1"및 "3"을 가장 가까운 이웃으로 대체하려고합니다 (계산이없고 다음 값이 "50"보다 높음). 교체해야 할 케이스의 왼쪽/변수 왼쪽에있는 값. 이 같아야 끝에

:

v1 v2 v3 v4 v5 v6 v7 
1 350 350 350 350 350 350 7 
2 460 460 460 460 400 400 400 
3 420 420 420 420 400 NA 200 
4 400 400 400 400 500 500 7 
5 400 500 500 500 500 500 500 
6 170 170 170 170 170 170 170 
7 420 420 420 420 300 300 7 

주 라인 (4) 여기서, 상기 오른쪽 발 (50) 위의 다음 값과 왼쪽의 값 및 하나의 치환은 "1"의 2 - 내가 "왼쪽의 우선 순위"로 의미했던 것.

지금까지 나는 impute-package의 임의의 전가에 대한 경험이 있었지만 knn-package를 보았습니다.하지만 이해할 때 NA와 만 작동합니다. 맞습니까? .CSV에 수출하고 수동으로 해결하는 것은 데려다 때문에 10 + 시간 (11 개 데이터 세트를 100 ~ 200 개 행 각각) 사전에

감사

나는 어떤 힌트 감사!

+0

결과 (행 3)에 'NA'가있는 이유는 무엇입니까 ?? – jlhoward

+0

DF1 [ "3", "v6"]은 400이어야합니까? – Emer

+0

또한 4 번 행은 규칙을 따르지 않는 것 같습니다. – jlhoward

답변

2

zoona.locf(...)을 사용하는 한 가지 방법이 있습니다.

# replace -1,1,3 with NA 
DF1 <- as.data.frame(sapply(DF1,function(x){x[x %in% c(-1,1,3)]<-NA;x})) 
library(zoo) 
# carry last obs forward into NAs, retaining NA at the beginnig of each row 
result <- apply(DF1,1,na.locf,na.rm=FALSE) 
result <- as.data.frame(t(apply(DF1,1,na.locf,fromLast=TRUE))) 
result 
# v1 v2 v3 v4 v5 v6 v7 
# 1 350 350 350 350 350 350 7 
# 2 460 460 460 400 400 400 400 
# 3 420 420 420 420 400 200 200 
# 4 400 400 500 500 500 500 7 
# 5 400 500 500 500 500 500 500 
# 6 170 170 170 170 170 170 170 
# 7 420 420 420 420 300 300 7 
+0

감사합니다. na.locf에 대해 알고 있었지만 멀리는 생각하지 않았습니다. 제 이해를 위해 : 세 번째 줄은 오른쪽에서 왼쪽과 네 번째, 맞습니까? 지금까지 "na.locf"가 한 번에 하나의 값을 대체한다는 것을 이해합니다. 예를 들어 8 개의 값이 누락 된 경우 코드의 3 번째 및 4 번째 행을 네 번 수행해야합니까? –

+0

아니요 코드가있는 그대로 실행됩니다. 'na.locf (...)'는 기본적으로 모든 NA를 마지막 비 NA 값으로 바꿉니다. 따라서'c (400, NA, NA, NA)'는'c (400400400400) '이됩니다. 나는 당신이 문서를 읽고 중간 결과를 연구 할 것을 제안한다. – jlhoward