Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算数据帧中(长)周末的天数_R_Dataframe - Fatal编程技术网

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天