【问题标题】:Subsetting data.table with a condition使用条件子集 data.table
【发布时间】:2013-12-15 08:27:04
【问题描述】:

如何对大数据表(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 参数中的行号?

【问题讨论】:

  • 在你的data.table(.) 命令中不需要cbind

标签: r data.table data-manipulation


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    使用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]
    

    【讨论】:

    • 谢谢!只是为了澄清,如何使用 i 参数对每个偶数进行采样?
    • +1。有了你正在做的事情,你必须从内部DT[..] 中进行子集化,即:DT[DT["a", sample(.I, 100)]$V1]。或者,您可以使用 [.data.table 中的 which 参数,如下所示:DT[sample(DT["a", which=TRUE])]
    猜你喜欢
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2015-07-14
    • 1970-01-01
    相关资源
    最近更新 更多