2016-05-03 12 views
3

Ich habe einen N x M Datenrahmen DF1 mit Zeilen- und Spaltennamen, wobei viele der Werte NA sind. Es gibt einen zweiten Datenrahmen DF2 (1 x M, also könnte wirklich ein Vektor sein) mit Zeilennamen, die mit DF1 identisch sind. Ich möchte DF2 verwenden, um fehlende Werte in DF1-Spalten zu füllen.Füllen von fehlenden Werten in einem dat.frame von einem anderen data.frame

Jede Hilfe würde wirklich geschätzt werden.

Udp: Sorry, wirklich sollte ein Beispiel angebracht haben

Datenrahmen mit NAs

> df = data.frame(matrix(rnorm(9), nrow=3)) 
> df[1,1] <- NA 
> df[2,2] <- NA 
> df[3,3] <- NA 
      X1   X2   X3 
1   NA -0.1364313   NA 
2 -0.7473972   NA -0.1662138 

Ersatzwerte (gleiche Zeile Namen, Spaltennamen - irrelevant

df2 = data.frame(c(1,2)) 
    c.1..2. 
1  1 
2  2 

Erwartete Ausgabe:

  X1   X2   X3 
1   1 -0.1364313   1 
2 -0.7473972   2 -0.1662138 
+0

Wie kann DF2 DF1 füllen, wenn es M x 1? DF1 hat n-mal so viele Zellen wie DF1 – cgage

+0

Sie müssen ein Beispiel für Ihr Problem angeben, einschließlich Beispieldaten und Ihre erwartete Ausgabe – SymbolixAU

+0

Bitte geben Sie reproduzierbaren Code mit Beispieldaten – HubertL

Antwort

1

Hier ist eine Möglichkeit, es zu tun, denke ich. Zuerst erstelle ich eine neue data.frame (new_df), mit nur übereinstimmenden Zeilen ausgewählt, dann führe ich eine sapply über die Daten, um NA Werte zu ersetzen.

set.seed(123) 
df = data.frame(matrix(rnorm(9), nrow=3)) 
df[1,1] <- NA 
df[2,2] <- NA 
df[3,3] <- NA 
df2 <- data.frame(c(1,2)) 
#create new data.frame 
new_df <- df[which(row.names(df2) == row.names(df)),] 
#use sapply() 
t(sapply(row.names(df2), FUN = function(x) 
    ifelse(is.na(new_df[row.names(new_df) == x,]), 
      df2[row.names(df2)== x,], 
      new_df[row.names(new_df) == x,]))) 

    [,1]  [,2]  [,3]  
1 1   0.07050839 0.4609162 
2 -0.2301775 2   -1.265061 

Beachten Sie, dass dies zu einem Verlust des Spaltennamen führt ... was wahrscheinlich bedeutet, dass es ein besserer Weg, es zu tun. Außerdem sind meine Daten unterschiedlich, da wir set.seed nicht verwendet haben.

1

können Sie tun auch eine einfache for-Schleife, die sich darum kümmern wird:

for(i in 1:dim(df)[1]){ 
    df[i,is.na(df[i,])] <- df2[i,] 
} 
Verwandte Themen