Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.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中重置为0时执行累加和?_R_Cumsum - Fatal编程技术网

如何在R中重置为0时执行累加和?

如何在R中重置为0时执行累加和?,r,cumsum,R,Cumsum,我有一个表,我想获得一个组内的累计和(按ID),但如果组内任何一点的计数器为0,则累计计数应重置,并再次从1开始累计计数 ID Counter Cumulative A 1 1 A 0 0 A 1 1 A 1 2 B 1 1 B 0 0

我有一个表,我想获得一个组内的累计和(按ID),但如果组内任何一点的计数器为0,则累计计数应重置,并再次从1开始累计计数

ID  Counter  Cumulative       
A  1         1
A  0         0              
A  1         1                
A  1         2                
B  1         1                 
B  0         0                
B  1         1    

创建临时组列以在每次遇到0时创建新组

library(dplyr)

df %>%
  group_by(ID, grp = cumsum(Counter == 0)) %>%
  mutate(Cumulative = cumsum(Counter)) %>%
  ungroup() %>%
  select(-grp) -> result

result

#  ID    Counter Cumulative
#  <chr>   <int>      <int>
#1 A           1          1
#2 A           0          0
#3 A           1          1
#4 A           1          2
#5 B           1          1
#6 B           0          0
#7 B           1          1
数据

df <- structure(list(ID = c("A", "A", "A", "A", "B", "B", "B"), Counter = c(1L, 
0L, 1L, 1L, 1L, 0L, 1L)), class = "data.frame", row.names = c(NA, -7L))

df另一种方法是

df %>% group_by(ID) %>%
  mutate(cs = accumulate(Counter, ~ifelse(.y == 0, .y, .x + .y)))
查看dear@Ronak在其评论中提供的数据

df <- structure(list(ID = c("A", "A", "A", "A", "A", "B", "B", "B"), Counter = c(1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L)), class = "data.frame", row.names = c(NA, -8L))

df %>% group_by(ID) %>%
  mutate(cs = accumulate(Counter, ~ifelse(.y == 0, .y, .x + .y)))

# A tibble: 8 x 3
# Groups:   ID [2]
  ID    Counter    cs
  <chr>   <int> <int>
1 A           1     1
2 A           0     0
3 A           1     1
4 A           1     2
5 A           1     3
6 B           1     1
7 B           0     0
8 B           1     1

df%group\u by(ID)%%>%
突变(cs=累积(计数器,~ifelse(.y==0.y.x+.y)))
#一个tibble:8x3
#组别:ID[2]
身份证计数器
一一一一
2 A 0 0
3 A 11
4 A 1 2
5 A 1 3
6b11
7B00
8 B 1 1

感谢您指出错误。我正在删除我的答案。这一次投了很多票!对我有用。请修改一下。
df <- structure(list(ID = c("A", "A", "A", "A", "A", "B", "B", "B"), Counter = c(1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L)), class = "data.frame", row.names = c(NA, -8L))

df %>% group_by(ID) %>%
  mutate(cs = accumulate(Counter, ~ifelse(.y == 0, .y, .x + .y)))

# A tibble: 8 x 3
# Groups:   ID [2]
  ID    Counter    cs
  <chr>   <int> <int>
1 A           1     1
2 A           0     0
3 A           1     1
4 A           1     2
5 A           1     3
6 B           1     1
7 B           0     0
8 B           1     1