2016-06-08 63 views
5

我正在使用data.table軟件包來完成一些分析。我正在採取的步驟之一涉及使用by =函數來獲取彙總統計信息。但是,必須根據每個by子集中的唯一結果計算聚合。我一直在使用unique和密鑰來確保每個by組由不同的記錄組成。隱約的東西像下面:在R的data.table中,如何將data.table的關鍵字保存到使用.SD引用的子集中?

dt_new <- dt_old[,uFunc_MyFunction(x = unique(.SD)),by = grouping_var] 

我注意到,在.SD的關鍵似乎是基於對dt_old按鍵和by =語句來改變。顯然,這對我的結果子集是否是唯一的有影響。

我想得到一些清晰,所以我寫了下面。

library(data.table) 
set.seed(1554) 
dt_example <- data.table(id = 1:50, 
         site = sample(x = c("A","B","C"), 
             size = 50, 
             replace = TRUE, 
             prob = c(0.4,0.4,0.2)), 
         group = sample(x = c("Eta","Mu","Omicron","Psi"), 
             size = 50, 
             replace = TRUE), 
         team = sample(x = 1:3, 
             size = 50, 
             replace = TRUE, 
             prob = c(0.2,0.3,0.5))) 

setkey(x = dt_example, 
     group, 
     team) 

> dt_example[,as.list(key(.SD)),by = site] 
    site V1 V2 
1: B group team 
2: A group team 
3: C group team 

setkey(x = dt_example, 
     site, 
     group, 
     team) 

> dt_example[,as.list(key(.SD)),by = site] 
Empty data.table (0 rows) of 1 col: site 

什麼我想明白是爲什麼,在第一個版本,爲.SD,關鍵是一致的,而在第二個版本,.SD沒有關鍵的。我認爲這與by =列不直接包含在.SD這一事實有關,這是打破關鍵,但我想確認我的邏輯。

所以,我的問題是這樣的:爲什麼數據表的子集.SD沒有密鑰時,其中包含父數據表的密鑰的列之一用作by分組變量?

+1

這個問題實際上只是一個FR。 – eddi

+0

@eddi什麼是FR? – TARehman

+0

FR =功能請求 – Jaap

回答

3

在這種情況下,因爲它是由site, group, team排序,同時通過site分組,關鍵可保留group, team作爲訂單將維持。最簡單的答案是我們似乎錯過了這種情況。你能否請用一個鏈接到這篇文章提出問題?

作爲解決方法,您可以使用unique方法中的by參數爲data.tables指定列。

正如大衛指出,在每一個組使用unique(.SD)似乎沒有必要,但是這可能是另一個問題:

+0

我會暫時記錄一個問題。我確實同意'unique(.SD)'是一個不尋常的用例。我真的不希望它被「固定」 - 只是很好奇底下發生了什麼。 – TARehman

+1

作爲1736提交給Github。https://github.com/Rdatatable/data.table/issues/1736 – TARehman