R - 如何使用年度累计和,并在满足条件时重新启动累计和

时间:2018-06-05 09:01:45

标签: r dataframe sum restart counting

我在R中有以下数据框:

  YEAR DOY   PRECTOT cumsum Lws   prec0
   <int> <chr>   <dbl>  <dbl> <chr> <chr>
 1  1982 121    6.05     6.05 no    no   
 2  1982 122    1.10     7.15 no    no   
 3  1982 123    0.490    7.64 no    no   
 4  1982 124    4.53    12.2  no    no   
 5  1982 125    3.94    16.1  no    no   
 6  1982 126    2.78    18.9  no    no   
 7  1982 127    0.420   19.3  no    no   
 8  1982 128    0.      19.3  no    yes  
 9  1982 129    0.0700  19.4  no    no   
10  1982 130    8.94    28.3  no    no 

我想要另一列计算累积总和,就像在cumsum列中一样,然后在PRECTOT为0时重新开始计数,例如在第8行。基本上它应该从第8行重新开始累积和,并从那里继续累积和,就是这样:

  YEAR DOY   PRECTOT cumsum Lws   prec0
   <int> <chr>   <dbl>  <dbl> <chr> <chr>
 1  1982 121    6.05     6.05 no    no   
 2  1982 122    1.10     7.15 no    no   
 3  1982 123    0.490    7.64 no    no   
 4  1982 124    4.53    12.2  no    no   
 5  1982 125    3.94    16.1  no    no   
 6  1982 126    2.78    18.9  no    no   
 7  1982 127    0.420   19.3  no    no   
 8  1982 128    0.      0  no    yes  
 9  1982 129    0.0700  0.0700  no    no   

在R中有一个很好而有效的方法吗?谢谢。

2 个答案:

答案 0 :(得分:4)

“满足条件时重新启动”部分由group_by(cumsum(<condition>))

完成
library(dplyr)

dat %>% 
  group_by(grp = cumsum(PRECTOT == 0)) %>% 
  mutate(cumsum = cumsum(PRECTOT))

# # A tibble: 10 x 7
# # Groups:   grp [2]
#     YEAR DOY   PRECTOT cumsum Lws   prec0   grp
#    <int> <chr>   <dbl>  <dbl> <chr> <chr> <int>
#  1  1982 121      6.05   6.05 no    no        0
#  2  1982 122      1.1    7.15 no    no        0
#  3  1982 123      0.49   7.64 no    no        0
#  4  1982 124      4.53  12.2  no    no        0
#  5  1982 125      3.94  16.1  no    no        0
#  6  1982 126      2.78  18.9  no    no        0
#  7  1982 127      0.42  19.3  no    no        0
#  8  1982 128      0      0    no    yes       1
#  9  1982 129      0.07   0.07 no    no        1
# 10  1982 130      8.94   9.01 no    no        1

数据:

dat <- readr::read_table2(
"YEAR DOY   PRECTOT cumsum Lws   prec0
1982 121    6.05     6.05 no    no
1982 122    1.10     7.15 no    no
1982 123    0.490    7.64 no    no
1982 124    4.53    12.2  no    no
1982 125    3.94    16.1  no    no
1982 126    2.78    18.9  no    no
1982 127    0.420   19.3  no    no
1982 128    0.      19.3  no    yes
1982 129    0.0700  19.4  no    no
1982 130    8.94    28.3  no    no
", col_types = "icddcc")

答案 1 :(得分:2)

这是使用data.table:

在满足条件时重新启动累积和的一种方法
dat <- read.table(header = TRUE, text = "YEAR DOY   PRECTOT cumsum Lws   prec0
1982 121    6.05     6.05 no    no
1982 122    1.10     7.15 no    no
1982 123    0.490    7.64 no    no
1982 124    4.53    12.2  no    no
1982 125    3.94    16.1  no    no
1982 126    2.78    18.9  no    no
1982 127    0.420   19.3  no    no
1982 128    0.      19.3  no    yes
1982 129    0.0700  19.4  no    no
1982 130    8.94    28.3  no    no")

library(data.table)
dat <- data.table(dat)
dat[, NEWCOL:=cumsum(PRECTOT), by=cumsum(PRECTOT==0)]

使用data.table group by {by=cumsum(<condition>))重新启动累积总和。