2016-06-22 3 views
2

ich einen Datenrahmen haben c wie dieseFilling NAs mit einem Datenrahmen verschmelzen

c 
      Freq  CTM 
000110100111 2  NA 
110110100111 1 32.58847 
111001011000 2  NA 
111111111111 1 25.61041 

und einen Datenrahmen nona_c wie diese

nona_c 
      Freq  CTM 
000110100111 2 37.0642 
111001011000 2 37.0642 

Ich möchte die nationalen Agenturen in der CTM Spalte von c ersetzen mit den CTM-Werten von nona_c. Die Rownames von nona_c (die binären Zeichenfolgen) werden immer in c existieren.

sollte die Ausgabe

mergedC 
      Freq  CTM 
000110100111 2 37.0642 
110110100111 1 32.58847 
111001011000 2 37.0642 
111111111111 1 25.61041 

Ich habe hier merge ohne Erfolg versucht

sein.

mergedC <- merge(x = c, y = nona_c, by = 0, #rownames 
    all.y = TRUE) 
+3

als eine Randnotiz; Es ist komisch, ein Objekt namens "c" zu sehen, besonders angesichts der "? c" -Funktion. Kann Probleme auf der ganzen Linie verursachen. – SymbolixAU

Antwort

4

A match Betrieb machen könnte dies einfacher:

c$CTM[is.na(c$CTM)] <- nona_c$CTM[match(rownames(c)[is.na(c$CTM)], rownames(nona_c))] 

#    Freq  CTM   id 
#000110100111 2 37.06420 000110100111 
#110110100111 1 32.58847 110110100111 
#111001011000 2 37.06420 111001011000 
#111111111111 1 25.61041 111111111111 
2

Wir können dies tun, mit data.table ein on die Variable von Interesse kommen Sie mit. Hier schließen wir uns der Spaltennamen-Spalte an. Die Werte von "i.CTM" werden dem "CTM" zugewiesen (:=).

library(data.table) 
setDT(c, keep.rownames=TRUE)[] 
setDT(nona_c, keep.rownames=TRUE)[] 

c[nona_c, CTM := i.CTM , on = "rn"] 
c 
#    rn Freq  CTM 
#1: 000110100111 2 37.06420 
#2: 110110100111 1 32.58847 
#3: 111001011000 2 37.06420 
#4: 111111111111 1 25.61041 

HINWEIS: Die row.names sind nicht in data.table oder dplyr beibehalten. Beim Konvertieren von "data.frame" in "data.table" verwenden wir keep.rownames = TRUE.