R 当第一个和最后一个观察值等于某个值时,求和之间的某些值

R 当第一个和最后一个观察值等于某个值时,求和之间的某些值,r,R,我有点像: df<-data.frame(group=c(1, 1, 1, 1,1, 2, 2, 2, 2, 2, 3, 3, 3), have=c(1, 0, 1, 0, 1, 1, 0,0,0,1, 1,0,0), wantsum=c(2,2,2,2,2,3,3,3,3,3,0,0,0)) # group have wantsum #1 1 1 2 #2 1

我有点像:

df<-data.frame(group=c(1, 1, 1, 1,1, 2, 2, 2, 2, 2, 3, 3, 3),         
               have=c(1, 0, 1, 0, 1, 1, 0,0,0,1, 1,0,0),
               wantsum=c(2,2,2,2,2,3,3,3,3,3,0,0,0))
#   group have wantsum
#1      1    1       2
#2      1    0       2
#3      1    1       2
#4      1    0       2
#5      1    1       2
#6      2    1       3
#7      2    0       3
#8      2    0       3
#9      2    0       3
#10     2    1       3
#11     3    1       0
#12     3    0       0
#13     3    0       0

谢谢

我们可以在按“组”分组后创建一个条件,方法是检查
如果
所有
则“have”中的
第一个
最后一个
观察值为1,然后获取“0”值的
,否则返回0

library(dplyr)
df %>%
   group_by(group) %>%
   mutate(wantsum2 = if(all(c(first(have), last(have)) == 1)) sum(have == 0) else 0)
# A tibble: 13 x 4
# Groups:   group [3]
#   group  have wantsum wantsum2
#   <dbl> <dbl>   <dbl>    <dbl>
# 1     1     1       2        2
# 2     1     0       2        2
# 3     1     1       2        2
# 4     1     0       2        2
# 5     1     1       2        2
# 6     2     1       3        3
# 7     2     0       3        3
# 8     2     0       3        3
# 9     2     0       3        3
#10     2     1       3        3
#11     3     1       0        0
#12     3     0       0        0
#13     3     0       0        0
df %>%
   group_by(group) %>%
   mutate(wantsum2 = sum(have == 0) * all(c(first(have), last(have)) == 1) )