Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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 - Fatal编程技术网

R 累积和重置为特定值

R 累积和重置为特定值,r,R,我有以下数据帧 x y count 1 1 2018-02-24 4.031540 2 2 2018-02-25 5.244303 3 3 2018-02-26 5.441465 4 NA 2018-02-27 4.164104 5 5 2018-02-28 5.172919 6 6 2018-03-01 5.591410 7 7 2018-03-02 4.691716 8 8 2018-03-03 5.465360 9 9 20

我有以下数据帧

    x          y    count
1   1 2018-02-24 4.031540
2   2 2018-02-25 5.244303
3   3 2018-02-26 5.441465
4  NA 2018-02-27 4.164104
5   5 2018-02-28 5.172919
6   6 2018-03-01 5.591410
7   7 2018-03-02 4.691716
8   8 2018-03-03 5.465360
9   9 2018-03-04 3.269378
10 NA 2018-03-05 5.300679
11 11 2018-03-06 5.489664
12 12 2018-03-07 4.423334
13 13 2018-03-08 3.808764
14 14 2018-03-09 6.450136
15 15 2018-03-10 5.541785
16 16 2018-03-11 4.762889
17 17 2018-03-12 5.511649
18 18 2018-03-13 6.795386
19 19 2018-03-14 6.615762
20 20 2018-03-15 4.749151
我想获取count列的
cumsum
,但我想在x值为
NA
时重新启动
cumsum
。我尝试了以下方法:

df$cum_sum可能的解决方案:

dat$cum_sum <- ave(dat$count, cumsum(is.na(dat$x)), FUN = cumsum)
或使用
dplyr

library(dplyr)
dat %>% 
  group_by(grp = cumsum(is.na(x))) %>% 
  mutate(cum_sum = cumsum(count)) %>% 
  ungroup() %>% 
  select(-grp)

我有data.table版本

 plouf <- setDT(df)
 plouf[,group := cumsum(is.na(x))]
 plouf[!is.na(x),cum_sum := cumsum(count),by = group]

     x          y    count group   cum_sum
 1:  1 2018-02-24 4.031540     0  4.031540
 2:  2 2018-02-25 5.244303     0  9.275843
 3:  3 2018-02-26 5.441465     0 14.717308
 4: NA 2018-02-27 4.164104     1        NA
 5:  5 2018-02-28 5.172919     1  5.172919
 6:  6 2018-03-01 5.591410     1 10.764329
 7:  7 2018-03-02 4.691716     1 15.456045
 8:  8 2018-03-03 5.465360     1 20.921405
 9:  9 2018-03-04 3.269378     1 24.190783
10: NA 2018-03-05 5.300679     2        NA
11: 11 2018-03-06 5.489664     2  5.489664
12: 12 2018-03-07 4.423334     2  9.912998
13: 13 2018-03-08 3.808764     2 13.721762
14: 14 2018-03-09 6.450136     2 20.171898
15: 15 2018-03-10 5.541785     2 25.713683
16: 16 2018-03-11 4.762889     2 30.476572
17: 17 2018-03-12 5.511649     2 35.988221
18: 18 2018-03-13 6.795386     2 42.783607
19: 19 2018-03-14 6.615762     2 49.399369
20: 20 2018-03-15 4.749151     2 54.148520

plouf
cumsum(is.na(x))
对观察结果进行分组非常聪明这刚刚解决了我遇到的一个头痛问题,谢谢你,Jaap!
library(dplyr)
dat %>% 
  group_by(grp = cumsum(is.na(x))) %>% 
  mutate(cum_sum = cumsum(count)) %>% 
  ungroup() %>% 
  select(-grp)
 plouf <- setDT(df)
 plouf[,group := cumsum(is.na(x))]
 plouf[!is.na(x),cum_sum := cumsum(count),by = group]

     x          y    count group   cum_sum
 1:  1 2018-02-24 4.031540     0  4.031540
 2:  2 2018-02-25 5.244303     0  9.275843
 3:  3 2018-02-26 5.441465     0 14.717308
 4: NA 2018-02-27 4.164104     1        NA
 5:  5 2018-02-28 5.172919     1  5.172919
 6:  6 2018-03-01 5.591410     1 10.764329
 7:  7 2018-03-02 4.691716     1 15.456045
 8:  8 2018-03-03 5.465360     1 20.921405
 9:  9 2018-03-04 3.269378     1 24.190783
10: NA 2018-03-05 5.300679     2        NA
11: 11 2018-03-06 5.489664     2  5.489664
12: 12 2018-03-07 4.423334     2  9.912998
13: 13 2018-03-08 3.808764     2 13.721762
14: 14 2018-03-09 6.450136     2 20.171898
15: 15 2018-03-10 5.541785     2 25.713683
16: 16 2018-03-11 4.762889     2 30.476572
17: 17 2018-03-12 5.511649     2 35.988221
18: 18 2018-03-13 6.795386     2 42.783607
19: 19 2018-03-14 6.615762     2 49.399369
20: 20 2018-03-15 4.749151     2 54.148520