使用条件子集data.table

时间:2013-11-29 07:45:14

标签: r data.table data-manipulation

如何对大型data.table(data.table包)的子样本进行采样?是否有更优雅的方式来执行以下

DT<- data.table(cbind(site = rep(letters[1:2], 1000), value = runif(2000)))
DT[site=="a"][sample(1:nrow(DT[site=="a"]), 100)]

猜猜有一个简单的解决方案,但无法选择正确的措辞来搜索。

更新 更一般地说,如何在不创建行号的临时列的情况下访问data.table的i参数中的行号?

2 个答案:

答案 0 :(得分:4)

使用data.table的最大好处之一是您可以为数据设置密钥 使用key然后.I(内置可修复版。请参阅?data.table了解更多信息),您可以使用:

setkey(DT, site)
DT[DT["a", sample(.I, 100)]] 

至于你的第二个问题"how can I access a row number in data.table's i argument"

# Just use the number directly:
DT[17]

答案 1 :(得分:3)

使用which,您可以找到行号。您可以简单地从具有所需属性的所有行中进行采样,而不是从1:nrow(...)进行采样。在您的示例中,您可以使用以下内容:

DT[sample(which(site=="a"), 100)]