2013-03-26 6 views
8

Die Frage bezieht sich auf einen Beitrag mit einem ähnlichen Titel (replace NA in an R vector with adjacent values). Ich möchte eine Spalte in einem Datenrahmen scannen und NAs durch den Wert in der angrenzenden Zelle ersetzen. In dem zuvor erwähnten Post bestand die Lösung darin, die NA nicht durch den Wert von dem benachbarten Vektor (z. B. das benachbarte Element in der Datenmatrix) zu ersetzen, sondern war ein bedingter Ersatz für einen festen Wert. Im Folgenden finden Sie ein reproduzierbares Beispiel für mein Problem:NA in Spalte mit Wert in angrenzender Spalte ersetzen

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 < - data.frame (UNIT, STATUS, BEENDET, START, STOP) TEST

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 

sollte das Ergebnis sein:

 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

vielleicht versuchen 'TEST $ UNIT [is.na (TEST $ UNIT)] <- TEST $ STATUS [is.na (TEST $ UNIT)]; TEST ' – Seth

+2

Sie können Typen innerhalb einer Spalte in einem Datenrahmen nicht mischen. –

Antwort

12

Es hat nicht funktioniert, weil der Status ein Faktor war. Wenn Sie Faktor mit numerisch mischen, ist numerisch am wenigsten einschränkend. Durch Erzwingen Status Sie erhalten sein Charakter die Ergebnisse, die Sie nach und die Spalte ist nun ein Zeichen Vektor:

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

Schneller als ich um 6 Sekunden. +1 (Ich lösche meine). – A5C1D2H2I1M1N2O1R2T1

+2

Gut, dass es Code war und nicht Pistolen :) –

+0

danke Jungs! das hat den Trick –

2

Sie haben

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

so zu tun, dass der Wert wird mit Fassung benachbarter Wert. Andernfalls besteht eine Diskrepanz zwischen der Anzahl der zu ersetzenden Werte und den Werten, durch die sie ersetzt werden sollen. Dies würde dazu führen, dass die Werte in Zeilenreihenfolge ersetzt werden. Es funktioniert in diesem Fall, weil die zwei Werte, die ersetzt werden, die ersten beiden sind.

+0

Ich denke, das ist OK als Antwort. Sicher, die Lösung ist die gleiche wie die von anderen, aber Sie haben eine Erklärung hinzugefügt, was vor sich geht. Es sollte meiner Meinung nach kein Kommentar sein. –

Verwandte Themen