代码之家  ›  专栏  ›  技术社区  ›  tassones

计数小于递增值的值数

r
  •  1
  • tassones  · 技术社区  · 4 年前

    我有一个数据框,我想计算小于或等于30的值的数量,然后计算小于或等于60的值的数量,小于或等于90的值的数量。。。我可以使用 sum(dat$values <= 30) 但我想以某种方式实现自动化。

    实例

    set.seed(917)
    dat <- as.data.frame(sample(0:2100,100,replace = F))
    colnames(dat)[1] <- "values"
    
    sum(dat$values <= 30)
    sum(dat$values <= 60)
    sum(dat$values <= 90)
    sum(dat$values <= 120)
    sum(dat$values <= 150)
    

    输出应该是

      BinWidth TotalValuesLessThan
    1       30                   1
    2       60                   1
    3       90                   2
    4      120                   3
    5      150                   4
    

    我希望以迭代方式将输出输出输出到 BinWidth = 2100 无需使用 sum(dat$values <= X) 70次。

    2 回复  |  直到 4 年前
        1
  •  1
  •   caldwellst    4 年前

    只需创建您的垃圾箱,并随它们一起应用即可。

    BinWidth <- seq(30, 2100, by = 30)
    TotalValueLessThan <- sapply(BinWidth, \(x) sum(dat$values <= x))
    
    head(data.frame(BinWidth, TotalValueLessThan))
    #>   BinWidth TotalValueLessThan
    #> 1       30                  0
    #> 2       60                  1
    #> 3       90                  3
    #> 4      120                  6
    #> 5      150                  6
    #> 6      180                 10
    

    改变 \(x) function(x) 如果您正在使用R<4.1.

        2
  •  0
  •   G. Grothendieck    4 年前

    我们可以使用findInterval:

    BinWidth <- seq(30, 150, 30)
    data.frame(BinWidth, TotalLessThan = findInterval(BinWidth, sort(dat$values)))
    ##   BinWidth TotalLessThan
    ## 1       30             0
    ## 2       60             1
    ## 3       90             3
    ## 4      120             6
    ## 5      150             6