【问题标题】:Selecting all values above a threshold and then a random sample of the values below the threshold选择高于阈值的所有值,然后选择低于阈值的值的随机样本
【发布时间】:2014-12-23 15:42:33
【问题描述】:

cars 数据集为例(如下所示),我想创建一个新的data.frame,方法是选择cars$speed >= 12 的所有行,并从cars$ 的行中随机抽取5 个样本速度

> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10

我可以通过多个步骤首先使用

选择 speed >= 12 的行
one <- cars[cars$speed >=12 , ]

然后选择 5 个随机样本,其中 cars$speed

two <- cars[sample( which( cars$speed < 12) , 5 ) , ]

然后rbind() 两个data.frames。

但是,我想将代码添加到更大的循环中,并且具有相同结果的单个步骤将是非常可取的。

提前感谢您的任何建议。

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为您仍然需要 rbind 结果,但您可以在一行代码中完成。我使用了 dplyr 的 sample_n 函数进行采样:

    library(dplyr)
    
    rbind(sample_n(cars[cars$speed<12,], 5), cars[cars$speed>=12,])
    

    如果您需要比rbind 更快的东西,dplyr 还具有rbind_list 功能。

    【讨论】:

      【解决方案2】:

      我不确定这还能压缩多少,但这里有一种方法:

      library(data.table)
      cdt <- data.table(cars)
      set.seed(1)
      ##
      rbind(
        cdt[speed>11,],
        cdt[speed<12,][sample(1:.N,5),])
      

      并且只是为了表明正确采样了 5 行,

      R> rbind(
          cdt[speed>11,],
          cdt[speed<12,][sample(1:.N,5),]
          )[order(speed)][1:8,]
         speed dist
      1:     4    2
      2:     7   22
      3:     7    4
      4:     8   16
      5:    10   18
      6:    12   14
      7:    12   20
      8:    12   24
      

      这不一定是data.table 特定的方法,我只是觉得语法好用。此外,如果您的实际数据非常大,您可能会看到使用data.table 并将rbind(&lt;first subset&gt;, &lt;second subset&gt;) 替换为rbindlist(list(&lt;first subset&gt;,&lt;second subset&gt;)) 带来的性能优势。

      编辑: 感谢@Arun,另一个data.table 方法:

      cdt[
        ,if (grp) .SD else .SD[sample(.N, 5L)],
        .(grp=speed>11), 
        .SDcols=1:2]
      

      【讨论】:

      • @Arun 谢谢! data.table 为单个包提供了异常丰富的语法,因此学习更多它的语法总是很好的。我不知道您可以这样定义内联组。
      【解决方案3】:

      也许是一个不太优雅的解决方案,但只使用普通的香草 R:

      cars[c(which(cars$speed >=12),sample(which(cars$speed < 12) , 5 )) ,]
      

      这可能不会加快速度,但可以避免额外调用 rbind

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-21
        • 2019-09-14
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多