R 计算数据帧中(长)周末的天数
我有以下数据帧:R 计算数据帧中(长)周末的天数,r,dataframe,R,Dataframe,我有以下数据帧: DAYS7 <- c('Monday','Tuesday','Wednesday','Thursday','Friday', 'Saturday', 'Sunday') DAYS <- rep(DAYS7,5) A <- c(0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1) B <- c(0,0,0,0,0,1,2,0,0,0,0,1,2,3,0
DAYS7 <- c('Monday','Tuesday','Wednesday','Thursday','Friday', 'Saturday', 'Sunday')
DAYS <- rep(DAYS7,5)
A <- c(0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1)
B <- c(0,0,0,0,0,1,2,0,0,0,0,1,2,3,0,0,0,0,1,2,3,4,5,0,0,1,2,3,0,0,0,0,0,1,2)
DESIRED_OUTPUT <- c(2,2,2,2,2,2,2,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,3,3,3,3,3,2,2,2,2,2,2,2)
dataframe <- as.data.frame(cbind(DAYS, A, B, DESIRED_OUTPUT))
DAYS7棘手的部分是定义一周,这一周是0组,然后是1组。我们可以使用rle
来实现这一点,完成后,我们可以将其用作ave
中的分组变量,并使用sum
计算每组中的1个数
with(dataframe, ave(A, with(rle(A == 0), rep(cumsum(values), lengths)), FUN = sum))
#[1] 2 2 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 3 3 3 3 3 2 2 2 2 2 2 2
由于B
是A
的累积和,我们也可以在这里使用它,并计算组中的max
值
with(dataframe, ave(B, with(rle(A == 0), rep(cumsum(values), lengths)), FUN = max))
dplyr
方式
library(tidyverse)
DAYS7 <- c('Monday','Tuesday','Wednesday','Thursday','Friday', 'Saturday', 'Sunday')
DAYS <- rep(DAYS7,5)
A <- c(0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1)
B <- c(0,0,0,0,0,1,2,0,0,0,0,1,2,3,0,0,0,0,1,2,3,4,5,0,0,1,2,3,0,0,0,0,0,1,2)
DESIRED_OUTPUT <- c(2,2,2,2,2,2,2,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,3,3,3,3,3,2,2,2,2,2,2,2)
dataframe <- data.frame(DAYS, A, B, DESIRED_OUTPUT)
dataframe %>%
mutate(beginningOfWeek = (B - lag(B)) < 0) %>%
mutate(beginningOfWeek = replace_na(beginningOfWeek, TRUE)) %>%
mutate(week_nr = cumsum(beginningOfWeek)) %>%
group_by(week_nr) %>%
mutate(desired_output = max(B))
DAYS A B DESIRED_OUTPUT beginningOfWeek week_nr desired_output
<fct> <dbl> <dbl> <dbl> <lgl> <int> <dbl>
1 Monday 0 0 2 TRUE 1 2
2 Tuesday 0 0 2 FALSE 1 2
3 Wednesday 0 0 2 FALSE 1 2
4 Thursday 0 0 2 FALSE 1 2
5 Friday 0 0 2 FALSE 1 2
6 Saturday 1 1 2 FALSE 1 2
7 Sunday 1 2 2 FALSE 1 2
8 Monday 0 0 3 TRUE 2 3
9 Tuesday 0 0 3 FALSE 2 3
10 Wednesday 0 0 3 FALSE 2 3
11 Thursday 0 0 3 FALSE 2 3
12 Friday 1 1 3 FALSE 2 3
13 Saturday 1 2 3 FALSE 2 3
14 Sunday 1 3 3 FALSE 2 3
15 Monday 0 0 5 TRUE 3 5
16 Tuesday 0 0 5 FALSE 3 5
17 Wednesday 0 0 5 FALSE 3 5
18 Thursday 0 0 5 FALSE 3 5
19 Friday 1 1 5 FALSE 3 5
20 Saturday 1 2 5 FALSE 3 5
21 Sunday 1 3 5 FALSE 3 5
22 Monday 1 4 5 FALSE 3 5
23 Tuesday 1 5 5 FALSE 3 5
24 Wednesday 0 0 3 TRUE 4 3
25 Thursday 0 0 3 FALSE 4 3
26 Friday 1 1 3 FALSE 4 3
27 Saturday 1 2 3 FALSE 4 3
28 Sunday 1 3 3 FALSE 4 3
29 Monday 0 0 2 TRUE 5 2
30 Tuesday 0 0 2 FALSE 5 2
31 Wednesday 0 0 2 FALSE 5 2
32 Thursday 0 0 2 FALSE 5 2
33 Friday 0 0 2 FALSE 5 2
34 Saturday 1 1 2 FALSE 5 2
35 Sunday 1 2 2 FALSE 5 2
库(tidyverse)
第7天