суммировать определенные значения между тем, когда первое и последнее наблюдение равны определенному значению - PullRequest
1 голос
/ 22 октября 2019

У меня есть что-то вроде:

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))

Я хочу суммировать количество нулей на группу, но только когда первое и последнее наблюдение равно 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 Ответ

1 голос
/ 22 октября 2019

Мы можем создать условие после группировки по 'group', проверив if all наблюдения first и last в 'have' равными 1, затем получим значения sum из '0'или else return 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) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...