计算R中求和大于特定值所需的行数

计算R中求和大于特定值所需的行数,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我想对dataframe进行子集划分,以便获得mpg值所需的行数至少为100 library(datasets) data(mtcars) head(mtcars) mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 Wag 21.0 6

我想对dataframe进行子集划分,以便获得
mpg
值所需的行数至少为100

library(datasets)

data(mtcars)
head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
输出应为前5个值 在大黄蜂运动后,mpg总和大于100

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
我想计算mpg列每一行的校验和,然后将输出作为获得至少100行校验和所需的行数,这应该可以解决这个问题

library(tidyverse)


df_answer <- mtcars %>% 
  rownames_to_column() %>% 
  tibble() %>% 
  mutate(cum_sum = cumsum(mpg)) %>% 
  filter(cum_sum < 100)

df_answer %>% 
  nrow() + 1
库(tidyverse)
df_回答%
行名称到列()%>%
tibble()%>%
突变(cum_sum=cumsum(mpg))%>%
过滤器(总和<100)
df_回答%>%
nrow()+1

使用
子集的基本R选项
+
cumsum

subset(mtcars, c(TRUE, cumsum(mpg) <= 100)[-nrow(mtcars)])

您还可以使用
purrr
库:

library(purrr)
which.max(purrr::accumulate(mtcars$mpg, `+`) > 100)

# 5

如果需要整个数据集,可以使用
dplyr::slice

library(tidyverse)

dplyr::slice(mtcars, 1 : which.max(purrr::accumulate(mtcars$mpg, `+`) > 100))

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
mtcars %>% 
  slice(1:(max(which(cumsum(mpg) < 100)) + 1))

您可以将筛选条件与
dplyr
一起使用:

library(tidyverse)

mtcars %>% 
  filter(row_number() %in% 1:(max(which(cumsum(mpg) < 100)) + 1))
代码可以用
切片缩短

library(tidyverse)

dplyr::slice(mtcars, 1 : which.max(purrr::accumulate(mtcars$mpg, `+`) > 100))

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
mtcars %>% 
  slice(1:(max(which(cumsum(mpg) < 100)) + 1))

我会将
cumsum
lag

library(dplyr)
    
mtcars %>% 
      filter(cumsum(lag(mpg, default = 0)) < 100) 
库(dplyr)
mtcars%>%
过滤器(累积和(滞后(mpg,默认值=0))<100)

我认为
while
语句是您需要的,谢谢。我想在每一步之后,将其与mpg列的所有上述行的校验和相加,然后将输出作为至少100行的行数。你能提供一个reprex吗?@Bruno我已经更新了问题以使其更清楚
library(dplyr)
    
mtcars %>% 
      filter(cumsum(lag(mpg, default = 0)) < 100)