如何动态地从data.table中提取一些随机行

Far*_*rel 27 r sample data.table

我有一个大的data.table(大约24000行和增长).我想根据几个标准对该数据表进行子集化,并从该子集(最终约为3000行)我想随机抽样4行.我不想创建一个名为3000左右的行data.table,计算其行数,然后根据行号进行采样.我怎么能在飞行中做到这一点?或者我应该通过创建表然后处理它,对其进行采样然后使用它rm()来摆脱它来吮吸它?

让我们模拟我的问题

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)) 
Run Code Online (Sandbox Code Playgroud)

这会产生一个随机长度表,它模拟了这样一个事实,即根据我的标准并依赖于我的起始表,我不知道子集化表的长度是多少

现在,如果我只想要前三行我可以这样做

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]
Run Code Online (Sandbox Code Playgroud)

但是,让我们说我不想要前三行,而是一个随机的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 ]
Run Code Online (Sandbox Code Playgroud)

那样不行.我如何在运行中计算初始data.frame的长度是多少?

Mat*_*wle 49

刚做完.N工作i.新的README项目:

.N现已发布i,FR#724.多亏这里间接的新手和Farrel直接在这里.

这现在有效:

DT[...][...][sample(.N,3)]
Run Code Online (Sandbox Code Playgroud)

例如

> 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
> 
Run Code Online (Sandbox Code Playgroud)

  • @ufos的[[...] [...]]部分只是为了传达链的一般情况,`.N`是指链的最后一部分(不是原始的DT`链的开始)。这个一般情况也涵盖了DT [sample(.N,3)]。 (3认同)
  • Darn,darn good.谢谢.这就是我想要的.我意识到我必须从GitHub安装最新版本.我遇到了"pdflatex不可用"的问题.我在某处读到了关于build_vignettes = F的论点,之后一切运行良好.`install_github("data.table","Rdatatable",build_vignettes = F)` (2认同)
  • 为什么不只是`DT[sample(.N,3)]`? (2认同)