2017-05-08 41 views
0

我有2個包含相同列的數據框。一個叫做newGames,另一個叫做existingGames。我想要做的是在兩個數據框之間檢查comapare newGames game_pk和sv_id列。如果兩個表中都存在game_pk和sv_id,我想從newGames數據框中刪除該行。如果在另一個數據框中存在2個值,則刪除行

 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 

e。代表現有遊戲數據框,N代表newGames數據框。我最終想要得到的是一個新的遊戲數據框,它顯示了現有遊戲數據框中不存在egame_pk AND e.sv_id(整個遊戲)或e.sv_id(單個遊戲距離)的所有列。 Sv_id是一個時間戳,因此可以爲不同的game_pk設置相同的值,所以「合併」這些字段會使該行獨一無二。

這個工程的失蹤遊戲(440697)

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

但我想

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

,它只是選擇完整的數據幀,而不是單一的缺失間距。

+2

您可能需要使用的'&''而不是|' –

+0

您能不能告訴newGames和existingGames數據幀的樣本?你應該看看'dplyr'包中的'anti_join'。 – Gopala

+0

@Gopala我該怎麼做? FYI - 數據框有76列。謝謝! –

回答

2

這裏是如何做到這一點與anti_joindplyr

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

當我測試它使用你的代碼它的作品,我看到加入,by = c(「game_pk」,「sv_id」)。當我在實際的表上運行它時,我得到的是同樣的東西,加入,by = c(「game_pk」,「sv_id」),但它返回所有3207記錄而不是1.ExistingGames有3206個記錄,newGames有3207個記錄。它應該返回一個缺失的音高。如果另一個game_pk存在sv_id,會導致這個問題嗎? –

+0

確保兩個表的列都是相同的類,並且沒有因素。 'str(new_game)'和'str(existing_game)'應該類似。 –

+1

此外,雖然您只是說它只連接兩列,但您也表示這兩個數據框都有74列。也許你可以嘗試指定哪些特定列加入,就像這樣:'anti_join(new_game,existing_game,by = c(「game_pk」,「sv_id」))' –

相關問題