【问题标题】:How do you extract a few random rows from a data.table on the fly您如何动态从 data.table 中提取一些随机行
【发布时间】:2023-03-28 03:40:01
【问题描述】:

我有一个很大的 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 的长度是多少?

【问题讨论】:

    标签: r data.table sample


    【解决方案1】:

    刚刚使.Ni 中工作。新的自述文件:

    .N 现在可在iFR#724 中使用。感谢新手间接here 和法雷尔直接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
    > 
    

    【讨论】:

    • 该死,该死的好。谢谢你。这正是我想要的。我意识到我必须从 GitHub 安装最新版本。我遇到了pdflatex is not available 的问题。我在某处读到了有关 build_vignettes=F 参数的信息,之后一切都运行良好。 install_github("data.table", "Rdatatable", build_vignettes=F)
    • 为什么不只是DT[sample(.N,3)]
    • @ufos [...][...] 部分只是传达用于链接时的一般情况,.N 指的是链的最后一部分(不是开头的原始DT链)。一般情况下也包括DT[sample(.N,3)]
    • @MattDowle 您如何在不更换的情况下进行采样?
    • @HermanToothrot sample(.N,3) 已经在采样,无需更换。如需更换样品,sample(.N,3,replace=TRUE)。见?sample
    【解决方案2】:

    有一个两步的方法:

    1. 使用.I 计算索引i
    2. 索引上的样本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)]
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 很好,谢谢。但请注意,这不会保留数据类型。我将每一列都转换为数字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多