2013-03-26 5 views
8

이 질문은 유사한 제목의 게시물 (replace NA in an R vector with adjacent values)과 관련됩니다. 데이터 프레임에서 열을 스캔하고 NA의 값을 인접한 셀의 값으로 대체하려고합니다. 전술 한 포스트에서, 해결책은 NA를 인접 벡터 (예를 들어, 데이터 매트릭스의 인접 요소)로부터의 값으로 대체하는 것이 아니라 고정 된 값을 조건부로 대체하는 것이었다. data.frame (UNIT, 상태, TERMINATED, START, STOP) TEST인접 열의 값으로 열의 NA 바꾸기

UNIT STATUS TERMINATED  START  STOP 
1 NA ACTIVE 1999-07-06 2007-04-23 2008-12-05 
2 NA INACTIVE 2008-12-05 2008-12-06 4712-12-31 
3 200 ACTIVE 2000-08-18 2004-06-01 2007-01-31 
4 200 ACTIVE 2000-08-18 2007-02-01 2008-04-18 
5 200 INACTIVE 2000-08-18 2008-04-19 2010-11-28 
6 200 ACTIVE 2008-08-18 2010-11-29 2010-12-29 
7 200 INACTIVE 2008-08-18 2010-12-30 4712-12-31 
8 300 ACTIVE 2006-09-19 2007-10-29 2008-02-04 
9 300 ACTIVE 2006-09-19 2008-02-05 2008-06-29 
10 300 ACTIVE 2006-09-19 2008-06-30 2009-02-06 
11 300 INACTIVE 1999-03-15 2009-02-07 4712-12-31 

#using the syntax for a conditional replace and hoping it works :/   
TEST$UNIT[is.na(TEST$UNIT)] <- TEST$STATUS; TEST 

    UNIT STATUS TERMINATED  START  STOP 
1  1 ACTIVE 1999-07-06 2007-04-23 2008-12-05 
2  2 INACTIVE 2008-12-05 2008-12-06 4712-12-31 
3 200 ACTIVE 2000-08-18 2004-06-01 2007-01-31 
4 200 ACTIVE 2000-08-18 2007-02-01 2008-04-18 
5 200 INACTIVE 2000-08-18 2008-04-19 2010-11-28 
6 200 ACTIVE 2008-08-18 2010-11-29 2010-12-29 
7 200 INACTIVE 2008-08-18 2010-12-30 4712-12-31 
8 300 ACTIVE 2006-09-19 2007-10-29 2008-02-04 
9 300 ACTIVE 2006-09-19 2008-02-05 2008-06-29 
10 300 ACTIVE 2006-09-19 2008-06-30 2009-02-06 
11 300 INACTIVE 1999-03-15 2009-02-07 4712-12-31 

을 결과가 있어야한다 -

UNIT <- c(NA,NA, 200, 200, 200, 200, 200, 300, 300, 300,300) 
STATUS <-c('ACTIVE','INACTIVE','ACTIVE','ACTIVE','INACTIVE','ACTIVE','INACTIVE','ACTIVE','ACTIVE', 
        'ACTIVE','INACTIVE') 
TERMINATED <- c('1999-07-06' , '2008-12-05' , '2000-08-18' , '2000-08-18' ,'2000-08-18' ,'2008-08-18', 
         '2008-08-18','2006-09-19','2006-09-19' ,'2006-09-19' ,'1999-03-15') 
START <- c('2007-04-23','2008-12-06','2004-06-01','2007-02-01','2008-04-19','2010-11-29','2010-12-30', 
        '2007-10-29','2008-02-05','2008-06-30','2009-02-07') 
STOP <- c('2008-12-05','4712-12-31','2007-01-31','2008-04-18','2010-11-28','2010-12-29','4712-12-31', 
        '2008-02-04','2008-06-29','2009-02-06','4712-12-31') 

TEST < :

다음은 재현 내 문제의 예입니다
 UNIT STATUS TERMINATED  START  STOP 
1 ACTIVE ACTIVE 1999-07-06 2007-04-23 2008-12-05 
2 INACTIVE INACTIVE 2008-12-05 2008-12-06 4712-12-31 
3  200 ACTIVE 2000-08-18 2004-06-01 2007-01-31 
4  200 ACTIVE 2000-08-18 2007-02-01 2008-04-18 
5  200 INACTIVE 2000-08-18 2008-04-19 2010-11-28 
6  200 ACTIVE 2008-08-18 2010-11-29 2010-12-29 
7  200 INACTIVE 2008-08-18 2010-12-30 4712-12-31 
8  300 ACTIVE 2006-09-19 2007-10-29 2008-02-04 
9  300 ACTIVE 2006-09-19 2008-02-05 2008-06-29 
10  300 ACTIVE 2006-09-19 2008-06-30 2009-02-06 
11  300 INACTIVE 1999-03-15 2009-02-07 4712-12-31 
+0

아마'TEST $ UNIT [is.na (TEST $ UNIT)] <- 테스트 $ 상태 [is.na (테스트 $ 단위)]; TEST ' – Seth

+2

데이터 프레임의 열 내에서 유형을 혼합 할 수 없습니다. –

답변

12

상태가 요인 이었기 때문에 작동하지 않았습니다. factor를 숫자와 혼합하면 숫자가 가장 제한이 적습니다. 문자로 상태를 강제로 당신은 당신이 후있어 결과를 얻고 열은 이제 문자 벡터이다 : 당신은 값이 대체됩니다 그래서

TEST$UNIT[is.na(TEST$UNIT)] <- TEST$STATUS[is.na(TEST$UNIT)] 

을 할 필요가

TEST$UNIT[is.na(TEST$UNIT)] <- as.character(TEST$STATUS[is.na(TEST$UNIT)]) 

##  UNIT STATUS TERMINATED  START  STOP 
## 1 ACTIVE ACTIVE 1999-07-06 2007-04-23 2008-12-05 
## 2 INACTIVE INACTIVE 2008-12-05 2008-12-06 4712-12-31 
## 3  200 ACTIVE 2000-08-18 2004-06-01 2007-01-31 
## 4  200 ACTIVE 2000-08-18 2007-02-01 2008-04-18 
## 5  200 INACTIVE 2000-08-18 2008-04-19 2010-11-28 
## 6  200 ACTIVE 2008-08-18 2010-11-29 2010-12-29 
## 7  200 INACTIVE 2008-08-18 2010-12-30 4712-12-31 
## 8  300 ACTIVE 2006-09-19 2007-10-29 2008-02-04 
## 9  300 ACTIVE 2006-09-19 2008-02-05 2008-06-29 
## 10  300 ACTIVE 2006-09-19 2008-06-30 2009-02-06 
## 11  300 INACTIVE 1999-03-15 2009-02-07 4712-12-31 
+0

나보다 6 초 빠릅니다. +1 (내가 삭제). – A5C1D2H2I1M1N2O1R2T1

+2

코드와 권총이 아니라는 것이 좋습니다. –

+0

고마워요! 그 트릭을했다 –

2

인접한 값. 그렇지 않으면 대체 할 값의 수와이를 대체 할 값 사이에 불일치가 있습니다. 이로 인해 값이 행 순서로 대체됩니다. 이 경우 대체되는 두 값은 처음 두 값이므로 작동합니다.

+0

나는 이것이 대답으로 괜찮다고 생각합니다. 물론, 솔루션은 다른 사람들이 제공 한 솔루션과 동일하지만 진행중인 작업에 대한 설명을 추가했습니다. 그것은 제 의견으로는 코멘트가 아니어야합니다. –

관련 문제