2016-03-14 62 views
-1

我想合併2個數據幀(data1data2)。最初都包含大約3500萬觀察值(每個大約2GB)。合併allow.cartasian = TRUE導致觀察結果太多

我從data2中刪除了重複項。我需要保留data 1中的副本,因爲我希望將它們用於data1中的每個觀察值的進一步計算。

我最初得到了有據可查的錯誤:

Check for duplicate key values in i , each of which join to the same group in x over and over again. If that's ok, try including j and dropping by (by-without-by) so that j runs for each group to avoid the large allocation. If you are sure you wish to proceed, rerun with allow.cartesian=TRUE . Otherwise, please search for this error message in the FAQ, Wiki, Stack Overflow and datatable-help for advice.

作爲一個解決方案(我看了幾個主題,如herehere,並here),我包括allow.cartesian=TRUE,但現在我碰到內存問題。另外,對於一個子集,它可以提供比我想要的更多的觀察值(data1現在有5000萬觀測值,儘管它被指定爲all.x=TRUE)。

我的代碼是:

#Remove duplicates before merge 
data2 <- unique(data2) 

#Merge 
require(data.table) 
data1 <- merge(data1, data2, by="ID", all.x=TRUE, allow.cartesian=TRUE) 

關於如何合併這個任何意見,是非常可喜的。

+0

您能否指定您嘗試通過合併實現的連接類型?你實際上不希望進行笛卡爾合併。這是一個交叉產品。你的內存不足,因爲結果將是35M^2數據點。見http://www.dofactory.com/Images/sql-joins.png –

+0

我需要一個左連接。如果我嘗試沒有使用allow.cartesian,我會收到一條錯誤消息(如上面的帖子中提到的「檢查重複...」) – Res1234

+0

示例不可重現,請閱讀如何在r tag上提出問題 – jangorecki

回答

1

爲了進行左連接,合併語句需要了解您正在使用哪個列作爲連接的「鍵」或「索引」。如果您有重複的列名稱被用作鍵/索引,它不知道該做什麼並出現該錯誤。此外,它需要知道如果要連接的列與現有列具有相同的名稱,該如何處理。

解決方法是暫時重命名左側(data1)數據集中的鍵/索引列作爲一般規則,重複列名在R中是「壞」的,因爲它會混淆很多函數。很多函數默默地呼叫make.unique()去重複列名以避免混淆。

如果有重複IDdata1改變他們colnames(data1) <- make.unique(colnames(data1)),將它們設置爲ID.1ID.2等,然後做你的合併(請務必因爲重命名的指定by.x="ID.1", by.y="ID"。默認情況下,複製是列合併將.y追加儘管你可以用suffixes=選項(See Merge helpfile for details)

最後指定後綴,值得注意的是,在data.tablemerge()功能往往比用類似的語法基礎merge()功能要快得多。見page 47 of the data.table manual