2017-05-08 2 views
0

Ich habe 2 Datenrahmen, die die gleichen Spalten enthalten. Einer heißt newGames, der andere heißt existingGames. Was ich tun möchte, ist, überprüfen Sie die newGames game_pk und sv_id Spalten zwischen den beiden Datenrahmen. Wenn die beiden Spalten game_pk und sv_id in beiden Tabellen vorhanden sind, möchte ich diese Zeile aus dem newGames-Datenrahmen entfernen.Zeilen löschen, wenn 2 Werte in einem anderen Datenrahmen vorhanden sind

 N.game_pk N.sv_id   E.game_pk E.sv_id 
1  440697  123456_789012  NA   NA 
2  440698  123456_789012  440698  NA 
3  440699  123456_789012  440699  123456_789012 

Die e. steht für den Datenrahmen existingGames und N. steht für den Datenrahmen newGames. Was ich am Ende möchte, ist ein newGames-Datenframe, der alle Spalten anzeigt, in denen eponame_pk UND e.sv_id (GANZES SPIEL) oder e.sv_id (einzelnes Spielfeld aus dem Spiel) nicht im Datenrahmen existingGames vorhanden sind. Sv_id ist ein Zeitstempel, so dass es möglich ist, den gleichen Wert für verschiedene Spiele zu haben, also macht das "Kombinieren" der Felder die Zeile einzigartig.

das funktioniert für fehlende Spiele (440697)

newGames2 <- newGames[!(newGames$game_pk %in% existingGames$game_pk),] 

aber ich versuchte

newGames2 <- newGames[!(newGames$game_pk %in% existingGames$game_pk) | (!(newGames$game_pk %in% existingGames$game_pk) & !(newGames$sv_id %in% existingGames$sv_id)),] 

und wählt nur den vollständigen Datenrahmen anstelle des einzigen fehlenden Spielfeld.

+2

Sie wahrscheinlich '&' statt 'verwenden müssen |' –

+0

Können Sie zeigen Probe von newGames und existingGames Datenrahmen? Sie sollten 'anti_join' im Paket' dplyr' betrachten. – Gopala

+0

@Gopala wie kann ich das tun? FYI - Die Datenrahmen haben 76 Spalten. Vielen Dank! –

Antwort

2

Hier ist, wie man das mit anti_join von dplyr:

new_game <- read.table(text="game_pk sv_id 
440697  123456_789012 
440698  123456_789012 
440699  123456_789012",header=TRUE,stringsAsFactors=FALSE) 

existing_game <- read.table(text="game_pk sv_id 
NA   NA 
440698  NA 
440699  123456_789012",header=TRUE,stringsAsFactors=FALSE) 

library(dplyr) 
anti_join(new_game,existing_game) 

    game_pk   sv_id 
1 440698 123456_789012 
2 440697 123456_789012 
+0

Wenn ich es mit Ihrem Code testen, funktioniert es und ich sehe Joining, by = c ("game_pk", "sv_id"). Wenn ich es gegen die tatsächlichen Tabellen laufe, bekomme ich das gleiche, Joining, by = c ("game_pk", "sv_id"), aber es gibt alle 3207 Datensätze statt 1. ExistingGames hat 3206 Datensätze, newGames hat 3207. Es sollte gib die eine fehlende Tonhöhe zurück. Wenn sv_id für ein anderes game_pk existiert, würde dies zu diesem Problem führen? –

+0

Stellen Sie sicher, dass die Spalten für beide Tabellen dieselbe Klasse aufweisen und dass keine Faktoren vorhanden sind. 'str (new_game)' und 'str (existing_game)' sollten ähnlich sein. –

+1

Zusätzlich, obwohl Sie sagen, dass es nur zwei Spalten verbindet, haben Sie auch gesagt, dass beide Datenrahmen 74 Spalten haben. Vielleicht könntest du versuchen, zu spezifizieren, auf welche spezifischen Spalten du hier so einsteigst: 'anti_join (neues_spiel, existierendes_spiel, durch = c (" spiel_pk "," sv_id "))' –

Verwandte Themen