首页 > 解决方案 > 查找列的总和低于 R 中给定值的行

问题描述

我有一个数据框(或 data.table)。我想按列的升序对行进行排序,然后选择列值总计刚好低于给定值的行。

例如,假设我有 mtcars 数据框。我已经按照 qsec 列的升序对行进行了排序。现在我想找到 qsec 值的总和低于 100 的行。如果我添加下一行,总和将超过 100。

我为此写了一个while循环,但我正在寻找一个更好的矢量解决方案。

> head((mtcars[order(mtcars$qsec), ]))
                mpg cyl disp  hp drat   wt  qsec vs am gear carb
Ford Pantera L 15.8   8  351 264 4.22 3.17 14.50  0  1    5    4
Maserati Bora  15.0   8  301 335 3.54 3.57 14.60  0  1    5    8
Camaro Z28     13.3   8  350 245 3.73 3.84 15.41  0  0    3    4
Ferrari Dino   19.7   6  145 175 3.62 2.77 15.50  0  1    5    6
Duster 360     14.3   8  360 245 3.21 3.57 15.84  0  0    3    4
Mazda RX4      21.0   6  160 110 3.90 2.62 16.46  0  1    4    4

标签: rdata.table

解决方案


在 data.table 中使用order排列列和cumsum函数来查找累积总和小于您的截止值的行

library(data.table)
mtcars <- copy(mtcars)                            # because binding is locked
setDT(mtcars)                                     # convert to data.table   
setorder(mtcars, qsec)                            # reorder rows
out <- mtcars[cumsum(qsec) < 100]                 # filter rows
out

在 tidyverse 中用于arrange对列进行排序并按filter条件选择行

library(tidyverse)
mtcars %>% arrange(qsec) %>% filter(cumsum(qsec) < 100)

推荐阅读