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

时间:2014-07-10 20:12:37

标签: r data.table sample

我有一个大的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)) 

这是一个随机长度表,它模拟了这样一个事实:根据我的标准并且根据我的起始表,我不知道子集化表的长度是什么

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

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的长度是多少?

3 个答案:

答案 0 :(得分:46)

刚刚.N使i工作。新的README项目:

  

.N现已在iFR#724中提供。感谢新手间接地here和Farrel直接here

这现在有效:

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

e.g。

> 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
> 

答案 1 :(得分:3)

有两步法:

  1. 使用i
  2. 计算索引.I
  3. 索引i
  4. 上的示例

    示例代码。

    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)]
    

答案 2 :(得分:1)

另一种替代方法是使用sapply方法。
  例如:

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