2014-07-10 53 views
20

我有一個很大的data.table(大約24000行和增長)。我想基於幾個標準和該子集(最終大約3000行)對該數據集進行子集化,我想隨機抽樣4行。我不想創建一個名爲3000左右的行data.table,對其行進行計數,然後根據行號進行抽樣。我如何在飛行中做到這一點?或者我應該通過創建表來吸收它,然後對其進行處理,對其進行採樣,然後使用rm()來消除它?如何從data.table中隨機提取幾行隨機行

讓我們模擬了我的問題

​​

,使一個隨機長度表,它模擬的是,根據我的標準,並根據我的出發臺的事實,我不知道是什麼的子集化的表的長度是

現在,如果我只是想在前三排,我可以做這樣的

data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[1:3] 

但是,讓我們說,我不想讓前三排,而是一個隨機3行,然後我想要做這樣的事情,例如...

data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[sample(x= 1:number of rows of that previous data.table,size = 3 ] 

這將無法正常工作。我如何在運行中計算初始data.frame的長度?

回答

36

剛讓.N工作在i。新的自述文件項目:

.N現在可在iFR#724。感謝新手間接here和Farrel直接here

這現在工作:

DT[...][...][sample(.N,3)] 

例如

> random.length <- sample(x = 15:30, size = 1) 
> data.table(city = sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"),size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[sample(.N, 3)] 
     city score 
1: New York  4 
2: Pittsburgh  3 
3: Cape Town  9 
> 
+2

該死,該死的好。謝謝。這正是我想要的。我意識到我必須從GitHub安裝最新版本。我遇到了'pdflatex不可用'的問題。我讀了一些關於build_vignettes = F參數的地方,並且之後都運行良好。 'install_github(「data.table」,「Rdatatable」,build_vignettes = F)' – Farrel

3

有一個兩步方法:

  1. 計算上使用索引i

實施例代碼.I

  • 樣本索引i

    require(data.table) 
    random.length <- sample(x = 15:30, size = 1) 
    data.table(city = sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"),size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[,i := .I][sample(i, 3)] 
    
  • 1

    另一種替代方式是使用sapply的方法。
    例如:

    as.data.table(sapply(DT[], sample, 10))