2014-07-10 49 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))