2017-03-31 19 views
0

我對R非常新,特別是data.table,我堅持以下。基於第二個data.table與否定過濾命令

我有2個data.tables,說「食堂」和「沙拉消費者」。 data.table「食堂」包含每個人的ID,日期,時間和物品。

第二data.table「Saladconsumer」中包含的誰買了一個沙拉,基本上是「食堂」的一個子集人ID,日期和時間。

現在,我想,這樣我得到的已經買在那一天沙拉和當天在食堂做了其他購買人過濾「食堂」的「Saladconsumer」。因此過濾必須包含一個否定:Canteen[, ID]==Saladconsumer[, ID] & Canteen[, date]==Saladconsumer[, date] & Canteen[, time]!=Saladconsumer[, time]

我只找到重疊和合並/連接的例子,如果所有的標準是相同的。這似乎是很簡單,但我想不出我的錯誤是什麼...

NewDT<- Canteen[, Canteen[, ID ] == Saladconsumer [, ID ] & Canteen[, date ] == Saladconsumer[, date ] & Canteen[, time ] == Saladconsumer [, time ]] 

這是什麼數據的模樣,什麼結果我在尋找:

Canteen  
ID Date Time 
00b47c5d83a5490e860086eb080f1f50 26.06.14 12:36:29 
00b47c898875483fb9fa0113d334e500 06.01.14 16:28:56 
00b4cb6c666e2b8152174479545fcef2 29.10.14 12:57:16 
00b4cb6c666e2b8152174479545fcef2 29.10.14 17:20:07 
00b64cef0230b7480fc96dfcad9b8394 07.05.14 11:43:34 
00b8b859987af5c89d90130d1206c579 03.01.14 13:35:15 
0205996c0139e0b909903c2ebacb5a77 07.01.14 14:48:13 
0205d25db373084f9bf8d431db8d3f9c 07.01.14 09:10:27 
0205d25db373084f9bf8d431db8d3f9c 07.01.14 13:48:21 
0208cfa78e51231cf30842ea0f8abdf4 10.04.14 10:06:43 

Salad consumer  
ID Date Time 
00b4cb6c666e2b8152174479545fcef2 29.10.14 12:57:16 
0205d25db373084f9bf8d431db8d3f9c 07.01.14 13:48:21 
020e53bd2076a9db4c9770662793602b 04.02.14 10:38:41 
020ed0685aa70b543981cbb6a7f0c737 16.01.14 15:40:02 
020aa996e0f4b6e886a82ce83d406e92 23.01.14 14:23:43 
020ac1d718ff47f5aaa2d684434bae93 30.06.14 13:47:45 
020b20874ae29027ddac149ab3d5a395 09.04.14 09:34:32 

Results  
ID Date Time 
00b4cb6c666e2b8152174479545fcef2 29.10.14 17:20:07 
0205d25db373084f9bf8d431db8d3f9c 07.01.14 09:10:27 
+0

沒有,有沒有這樣的合併命令。您可以合併所有列,創建一個1/0列來指示哪些匹配,然後過濾到相反的。顯然,我只能用這些模糊的詞彙來解釋它,因爲你並不願意提供一個例子。請參閱http://stackoverflow.com/help/how-to-ask – Frank

回答

0

我會邀請你到tidyverse(其中包括包dplyr),並推薦一個左連接,然後是反連接。

我還建議在尋找對數據操作的RStudio小抄:https://www.rstudio.com/resources/cheatsheets/

這應該做的伎倆(雖然我可能有小姐解釋你在找什麼 - 在這種情況下,我很樂意進一步提供幫助) :

library(tidyverse) 

SaladPeople <- select(Saladconsumer, ID) %>% left_join(Canteen) 

現在你只有食堂的沙拉消費者。如果我知道你在找什麼,那麼你可以做一個反連接:

yourData <- anti_join(SaladPeople, Saladconsumer) 

或者像一個會做這樣的tidyverse:

yourData <- select(Saladconsumer, ID) %>% 
    left_join(Canteen, by="ID") %>% 
    anti_join(Saladconsumer)) 
+0

非常感謝您看看我的問題。不幸的是,我沒有收到我期望/期待的結果。我添加了我的數據的子集和所需的結果。也許這會更好一點。 –

+0

O它看起來像我以爲你想在同一天購買沙拉的人購買。請嘗試編輯的代碼。 –

+0

是的,這就是我想要的!在結果中,我只有沙拉消費者第二次購買當天!你可以請重置編碼!我會非常感謝! –