2014-09-16 10 views
9

Sicherlich ist das nicht beabsichtigt? Ist das etwas, was in anderen Teilen der Funktionalität von dplyr passiert und sollte ich betroffen sein? Ich liebe die Leistung und hasse data.table Syntax. Gibt es eine Alternative zu dplyr und data.table, die derzeit sicher und trotzdem leistungsstark ist?Falsches Verhalten mit dplyrs left_join?

A <- structure(list(ORDER = c(30305720L, 30334659L, 30379936L, 
        30406397L, 30407697L, 30431950L), 
        COST = c("0", "", "11430.52", "20196.279999999999", "0", "10445.99")), 
       .Names = c("ORDER", "COST"), 
       row.names = c(NA, 6L), 
       class = "data.frame") 

B <- structure(list(ORDER = c(30334659, 30379936, 30406397, 30407697, 30431950), 
        AREA = c(0, 2339, 2162, 23040, 475466)), 
       .Names = c("ORDER", "AREA"), 
       row.names = c(4L, 8L, 11L, 12L, 15L), 
       class = c("tbl_df", "tbl", "data.frame")) 

Garbage Ergebnisse:

left_join(A, B) 
    ORDER COST     AREA 
1 30305720     0 NA 
2 30334659      NA 
3 30379936   11430.52 NA 
4 30406397 20196.279999999999 NA 
5 30407697     0 NA 
6 30431950   10445.99 NA 

Effektive Ergebnisse:

merge(A, B, all.x=T, all.y=F) 
    ORDER    COST AREA 
1 30305720     0  NA 
2 30334659       0 
3 30379936   11430.52 2339 
4 30406397 20196.279999999999 2162 
5 30407697     0 23040 
6 30431950   10445.99 475466 
+0

Ich verwende R Version 3.1. – stanekam

+0

Beachten Sie, dass dies hier erneut angezeigt wird https://github.com/hadley/dplyr/issues/601 – mnel

+1

Beachten Sie, dass die 'data.table' Syntax' setDT (A); setDT (B); setkey (A, ORDER) ; setkey (B, ORDER); A [B] 'arbeitet, um die" effektiven Ergebnisse "zu liefern. 'data.table' macht Schlüssel/Gruppierung innerhalb der Maschinentoleranz gleich. – mnel

Antwort

10

gab ich etwas ähnliches den anderen Tag. Ich denke, was Sie tun müssen, ist ORDER als numerisch (oder möglicherweise andersherum). A hat ORDER hat Integer. Aber B hat ORDER als numerisch. Im Moment fragt dplyr Sie nach Gruppierungsvariablen in derselben Klasse. Ich erhielt einen Kommentar von einem SO-Benutzer, der sagte, dass Hadley und sein Team gerade daran gearbeitet hätten. Dieses Problem wird in Zukunft behoben.

A$ORDER <- as.numeric(A$ORDER) 
left_join(A,B, by = "ORDER") 

    ORDER    COST AREA 
1 30305720     0  NA 
2 30334659       0 
3 30379936   11430.52 2339 
4 30406397 20196.279999999999 2162 
5 30407697     0 23040 
6 30431950   10445.99 475466 

UPDATE Nach Kommentaren mit thelatemail Austausch, entschied ich mich hier mehr Beobachtungen hinzuzufügen.

CASE 1: Behandle ORDER als numerische

A$ORDER <- as.numeric(A$ORDER) 

> left_join(A,B, by = "ORDER") 
    ORDER    COST AREA 
1 30305720     0  NA 
2 30334659       0 
3 30379936   11430.52 2339 
4 30406397 20196.279999999999 2162 
5 30407697     0 23040 
6 30431950   10445.99 475466 

> left_join(B,A, by = "ORDER") 
Source: local data frame [5 x 3] 

    ORDER AREA    COST 
1 30334659  0     
2 30379936 2339   11430.52 
3 30406397 2162 20196.279999999999 
4 30407697 23040     0 
5 30431950 475466   10445.99 

Wenn Sie ORDER als ganze Zahl in beiden A und B haben, geht das auch.

CASE 2: Behandeln Sie ORDER als integer und numerische

> left_join(A,B, by = "ORDER") 
    ORDER    COST AREA 
1 30305720     0 NA 
2 30334659      NA 
3 30379936   11430.52 NA 
4 30406397 20196.279999999999 NA 
5 30407697     0 NA 
6 30431950   10445.99 NA 

> left_join(B,A, by = "ORDER") 
Source: local data frame [5 x 3] 

    ORDER AREA    COST 
1 30334659  0     
2 30379936 2339   11430.52 
3 30406397 2162 20196.279999999999 
4 30407697 23040     0 
5 30431950 475466   10445.99 

von thelatemail vorgeschlagen As, integer/Zahlenkombination funktioniert nicht. Aber numerische/Ganzzahl-Kombination funktioniert.

Angesichts dieser Beobachtungen ist es sicher, im Moment in Gruppe-zu-Variable konsistent zu sein. Alternativ ist merge() der Weg zu gehen. Es kann ganzzahlig und numerisch sein.

> merge(A,B, by = "ORDER", all = TRUE) 
    ORDER    COST AREA 
1 30305720     0  NA 
2 30334659       0 
3 30379936   11430.52 2339 
4 30406397 20196.279999999999 2162 
5 30407697     0 23040 
6 30431950   10445.99 475466 

> merge(B,A, by = "ORDER", all = TRUE) 
    ORDER AREA    COST 
1 30305720  NA     0 
2 30334659  0     
3 30379936 2339   11430.52 
4 30406397 2162 20196.279999999999 
5 30407697 23040     0 
6 30431950 475466   10445.99 

UPDATE2 (ab dem 8. November 2014)

ich eine Entwickler-Version von dplyr (dplyr_0.3.0.9000) verwenden, die Sie von Github herunterladen. Das obige Problem ist jetzt gelöst.

left_join(A,B, by = "ORDER") 
#  ORDER    COST AREA 
#1 30305720     0  NA 
#2 30334659       0 
#3 30379936   11430.52 2339 
#4 30406397 20196.279999999999 2162 
#5 30407697     0 23040 
#6 30431950   10445.99 475466 
+1

+1 - bis zum Schlag geschlagen. Ich bin immer noch verwirrt darüber, warum 'left_join (B, A)' scheint in Ordnung zu sein, obwohl. – thelatemail

+0

@thelatemail Das ist eine interessante Beobachtung. Wenn das der Fall ist, dann ist das ein echter Bug? – jazzurro

+0

Auf einen kurzen Blick würde ich sagen, dass es ist. Es wäre für mich nicht konsistent, wenn ein Integer/numerischer Join fehlschlägt, sondern ein numerischer/ganzzahliger Join, um erfolgreich zu sein. – thelatemail

-1

Von der dplyr Dokumentation:

left_join() gibt alle Zeilen aus x, und alle Spalten von x und y. Zeilen in x ohne Übereinstimmung in y haben NA-Werte in den neuen Spalten. Wenn mehrere Übereinstimmungen zwischen x und y vorhanden sind, werden alle Kombinationen der Übereinstimmungen zurückgegeben.

semi_join() gibt alle Zeilen von x zurück, in denen übereinstimmende Werte in y vorhanden sind, wobei nur Spalten von x beibehalten werden. Ein Semi-Join unterscheidet sich von einem inneren Join, da ein Inner-Join eine Zeile von x für jede übereinstimmende Zeile von y zurückgibt, wobei ein Semi-Join niemals Zeilen von x dupliziert.

Es ist semi_join() eine wertvolle Option für Sie?

Verwandte Themen