计算R中求和大于特定值所需的行数
我想对dataframe进行子集划分,以便获得计算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
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)