Нам нужно сгруппировать по run-length-id
из 'ant', чтобы создать уникальный идентификатор всякий раз, когда значение 'ant' переключается на другое значение.
library(tidyverse)
library(data.table)
test %>%
group_by(grp = rleid(ant)) %>% # rleid from data.table
mutate(diff1 = c(0, diff(x))) %>%
#or use the OP's code
# mutate(diff1 = x - lag(x, default = first(x))) %>%
ungroup %>%
select(-grp) # remove the created grp column
# A tibble: 20 x 4
# x ant diff diff1
# <int> <chr> <int> <int>
# 1 1 n 0 0
# 2 2 s 0 0
# 3 3 s 1 1
# 4 4 n 0 0
# 5 5 s 0 0
# 6 6 n 0 0
# 7 7 s 0 0
# 8 8 s 1 1
# 9 9 s 1 1
#10 10 s 1 1
#11 11 s 1 1
#12 12 n 0 0
#13 13 s 0 0
#14 14 n 0 0
#15 15 s 0 0
#16 16 n 0 0
#17 17 n 1 1
#18 18 n 1 1
#19 19 n 1 1
#20 20 s 0 0
data
test <- structure(list(x = 1:20, ant = c("n", "s", "s", "n", "s", "n",
"s", "s", "s", "s", "s", "n", "s", "n", "s", "n", "n", "n", "n",
"s"), diff = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L,
0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L)), class = "data.frame",
row.names = c(NA, -20L))