第一个和最后一个观察值等于某个值时的某些值之和

时间:2019-10-22 18:03:22

标签: 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))

我想将每个组的0总数相加,但是仅当第一个和最后一个观察值等于1时。

#   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

谢谢

1 个答案:

答案 0 :(得分:1)

我们可以按'group'分组后创建条件,方法是检查{have'中的ifall观察值first last,然后得到sum个“ 0”值或else返回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

有多种方法可以实现此目的,因此可以通过将if/else生成的逻辑矢量乘以all-> TRUE/FALSE来修改1/0条件,任何数字乘以0-> 0再乘以1->数字

df %>%
   group_by(group) %>%
   mutate(wantsum2 = sum(have == 0) * all(c(first(have), last(have)) == 1) )