2017-02-13 4 views
-1

Ich habe zwei Datenrahmen, die eine gemeinsame Spalte teilen (mit dem Namen sys_loc_code). Der erste Datenrahmen (df1) hat 1033 Zeilen. Der zweite Datenrahmen (df2) hat 2751.Join und Merge ist nicht korrekt zurückgegeben Anzahl der Zeilen in R

Ich möchte df1 und df2 kombinieren, so dass ein neuer Datenrahmen mit allen Spalten in df1 und df2 erhalten nur Zeilen aus df1 erhalten.

ich join versucht haben, left_join und inner_join (von dplyr) und eine einfache merge. Jeder von diesen gibt 2057 Zeilen zurück, und ich denke, es sollte nur 1033 zurückgeben, um zu entsprechen, was in df1 ist. Wie gebe ich nur Zeilen von df1 zurück?

Ich kann die Datasets, die dieses Problem verursacht haben, nicht teilen. Doch nach einem bisschen Beratung kann ich das Problem mit diesem minimalen Beispiel neu erstellen:

df1 <- 
    data.frame(
    sys_loc_code = c("A", "B", "C") 
    , df1Val = 1 
) 


df2 <- 
    data.frame(
    sys_loc_code = c("A", "B", "B", "C", "D") 
    , df2Val = c(1, 1, 2, 1, 1) 
) 

left_join(df1, df2) 

Returns 4 Reihen, während df1 nur drei Zeilen.

Antwort

0

Das meiste Problem ist, dass df2$sys_loc_code mehrere Einträge für einige der Werte in df1$sys_loc_code enthält.

df1$sys_loc_code hat nur 3 Werte, aber einer von ihnen ("B") ist zweimal in df2$sys_loc_code vorhanden, was bedeutet, dass diese Zusammenführungen 4 Zeilen zurückgeben. z.B.

left_join(df1, df2) 

gibt

sys_loc_code df1Val df2Val 
1   A  1  1 
2   B  1  1 
3   B  1  2 
4   C  1  1 

die kurze Antwort auf Ihre Frage sein kann, so dass die Ergebnisse sind eigentlich „richtige“ basiert auf dem Code, den Sie schreiben. Wenn Sie möchten, dass etwas anderes passiert (z. B. nur ein Eintrag von df2 pro Übereinstimmung), müssen Sie wahrscheinlich genau entscheiden, welche Ausgabe Sie möchten.

Zum Beispiel, wenn Sie den ersten Eintrag von df2 wollen:

left_join(
    df1 
    , df2 %>% 
    group_by(sys_loc_code) %>% 
    slice(1) 
) 

gibt

sys_loc_code df1Val df2Val 
1   A  1  1 
2   B  1  1 
3   C  1  1 


left_join(
    df1 
    , df2 %>% 
    group_by(sys_loc_code) %>% 
    summarise(df2Val = mean(df2Val)) 
) 

sys_loc_code df1Val df2Val 
1   A  1 1.0 
2   B  1 1.5 
3   C  1 1.0 

und

left_join(
    df1 
    , df2 %>% 
    mutate(aVarToSortOn = 1:n()) %>% 
    group_by(sys_loc_code) %>% 
    slice(which.max(aVarToSortOn)) 
) 
gibt

gibt

sys_loc_code df1Val df2Val aVarToSortOn 
1   A  1  1   1 
2   B  1  2   3 
3   C  1  1   4 

Wenn Sie wissen, dass Sie eindeutige Werte in einer Spalte haben, könnten Sie auch filter verwenden, um auszuwählen, welche von df2

+0

zu halten übereinstimmen, das ist wahr. Ist es besser, wenn ich versuche, eine Nachschlagetabelle oder etwas zu verwenden, um Spalten in df2 zu füllen, die ich in df1 haben möchte? –

+0

Es hängt von Ihrem Ziel ab. Ich würde 'df2%>% group_by (sys_loc_code)' verwenden, gefolgt von 'summarise',' slice' oder 'filter', je nachdem, ob Sie ein Aggregat, den ersten oder einen bestimmten Eintrag und dann' left_join' wollen das Ergebnis. –

Verwandte Themen