2017-02-03 1 views
-2

Zwei Eingabedatensätze:R: Wie kann man fehlende Werte effizient mit einem anderen Datensatz füllen?

A 
    id value 
    <dbl> <lgl> 
1  1 NA 
2  2 2 
3  3 3 

Es erreicht mit folgenden for-Schleife werden kann:

A <- data.frame(id = c(1, 2, 3), value = rep(NA, 3)) 
A 
    id value 
    <dbl> <lgl> 
1  1 NA 
2  2 NA 
3  3 NA 

B <- data.frame(id = c(3, 2), value = c(3, 2)) 
B 
    id value 
1 3  3 
2 2  2 

Nach dem verfügbaren Wert in B nach A Zugabe, es ist zu erwarten. For-Loop ist jedoch im Allgemeinen sehr langsam. Wie man es effizienter macht?

for(i in 1:nrow(A)){ 
    item <- A[i,] 
    print(item) 
    if(is.na(item$value) && (item$id %in% B$id)){ 
    A[i, "value"] <- B[B$id == item$id,]$value 
    } 
} 

Join kann dieses Problem lösen. aber eine Regel erforderlich, um den Konflikt zu lösen.

+0

@nrussell, das braucht B, um A. zu überschreiben, zu welcher Art von Join gehört es? – HappyCoding

+2

Linke Verbindung, dann Koaleszenz - 'left_join (A, B, mit = "id")%>% muate (Wert = Koaleszenz (Wert.x, Wert.y))%>% Auswahl (ID, Wert) '. – nrussell

+0

danke. Das ist die Antwort. – HappyCoding

Antwort

-1

können Sie verwenden ein (dplyr) beitreten:

library(dplyr) 

A <- data.frame(id = c(1, 2, 3), value = rep(NA, 3)) 
B <- data.frame(id = c(3, 2), value = c(3, 2)) 

A %>% left_join(B, by='id') %>% 
    mutate(value = ifelse(is.na(value.x),value.y,value.x)) 

siehe Kommentar Ihre Frage zu erfahren, welche Daten Beitritt geht.

+0

danke. mutate funktioniert gut mit Join für diesen Fall. – HappyCoding

Verwandte Themen