2012-03-05 54 views
9

有沒有辦法從對象(數據框,矩陣,矢量)中選擇一個子集沒有複製選定的數據?R:選擇子集而不復制

我使用相當大的數據集,但從不改變它們。不過,爲了方便,我經常選擇要操作的數據的子集。每次製作一個大型子集的拷貝都是非常低效的內存,但是正常索引和功能家族都可以創建所選數據的副本。所以我在尋找可以解決這個問題的函數或數據結構。

可能適合我的需要,希望一些可能的方案在一些R封裝中實現:

  • 寫入時複製機制,只被複製,即數據結構當您添加或重寫現有的元素;
  • 不可變的數據結構,只需要重新創建數據結構的索引信息,而不是它的內容(比如通過創建小對象保存長度和指向同一個char數組的指針來從字符串中創建子字符串);
  • xapply()不創建子集的類似物。
+0

我想你應該看一下'data.table'包(有人大概會在這裏很快出現給你更多的細節......) – 2012-03-05 20:51:07

+0

數據庫接口顯然是你應該研究的。幾乎在r中的每一件事物都是傳承諾言,此時有效地傳遞值,此時需要對子集進行任何操作。 – 2012-03-05 20:51:16

+0

@BenBolker:謝謝,'data.table'似乎是很好的包,但不幸的是它在大多數情況下不符合我的需要。特別是,'data.table'有另一個索引模型,並且使得執行諸如'data [1:50,1:10]'的選擇(即,通過行和列選擇)和很多線性代數運算。我正在考慮使用矩陣而不是我的數據框來節省空間和時間,但矩陣也有其侷限性,所以我正在尋找其他選項。 – ffriend 2012-03-05 23:57:41

回答

5

試用包ref。具體而言,其refdata類。

data.table可能會遺漏的是,在分組(by=參數)時,數據的子集不會被複制,因此速度很快。 [嗯技術上它們是但到被重複用於每個組,並複製使用的memcpy是除R的快得多用於C.環路存儲器共享區域]

data.table:=是在修改data.table單程地點。 data.table偏離了通常的R編程風格,因爲它是而不是寫時複製。用戶必須明確地調用copy()來複制(可能非常大的)表,即使在一個函數內。

你是對的,沒有像refdata內置於data.table機制。我明白你的意思,這將是一個不錯的功能。儘管如此,refdata應該可以在data.table上工作,並且您可能在data.frame(但請務必使用tracemem(DF)監控副本)時也可以。

還有idata.frame(不可變的data.frame)在包plyr你可以試試。

+0

很好的答案,謝謝! – ffriend 2012-03-06 21:05:06