Мы умножаем «юг» на «расстояние» («cumdist»), чтобы изменить значения в «расстоянии», которое соответствует 0 на «юге», на 0, сгруппированные по «животным» и группе, созданной путем взятия совокупногосумма логического вектора (south == 0
), получите cumsum
из 'cumdist', ungroup
и удалите ненужные столбцы (grp
)
library(dplyr)
dfN %>%
mutate(cumdist = south * distance) %>%
group_by(animal, grp = cumsum(south == 0)) %>%
mutate(cumdist = cumsum(cumdist)) %>%
ungroup %>%
select(-grp)
# A tibble: 6 x 5
# animal azimuth south distance cumdist
# <chr> <dbl> <int> <dbl> <dbl>
#1 pb1 188. 1 1.99 1.99
#2 pb1 147. 1 8.57 10.6
#3 pb1 71.0 0 5.75 0
#4 pb1 120. 1 10.5 10.5
#5 pb2 102. 1 9.23 9.23
#6 pb2 85.7 0 8.82 0
Илианалогичный подход с base R
with(dfN, ave(distance * south, animal, cumsum(!south), FUN = cumsum))
#[1] 1.992 10.559 0.000 10.451 9.227 0.000
data
dfN <- structure(list(animal = c("pb1", "pb1", "pb1", "pb1", "pb2",
"pb2"), azimuth = c(187.561, 147.219, 71.032, 119.502, 101.702,
85.715), south = c(1L, 1L, 0L, 1L, 1L, 0L), distance = c(1.992,
8.567, 5.754, 10.451, 9.227, 8.821)), class = "data.frame",
row.names = c(NA, -6L))