Один из вариантов - использовать для этого dplyr
.
Ваша ожидаемая выходная таблица немного не совпадает, поскольку первая временная метка не соответствует week_no.
library(dplyr)
df %>%
group_by(id) %>%
mutate(diff1 = week_no - lag(week_no)) %>%
filter(timestamp == max(timestamp))
# A tibble: 2 x 4
# Groups: id [2]
id timestamp week_no diff1
<chr> <dttm> <int> <int>
1 b9968 2016-08-23 17:46:44 34 1
2 4983f 2016-08-13 17:30:47 32 0
data:
df <- structure(list(id = c("b9968", "b9968", "b9968", "b9968", "4983f",
"4983f"),
timestamp = structure(c(1471426713, 1471541603, 1471631120,
1471974404, 1471003283, 1471109447),
tzone = "UTC", class = c("POSIXct","POSIXt")),
week_no = c(33L, 33L, 33L, 34L, 32L, 32L)),
.Names = c("id", "timestamp", "week_no"),
row.names = c(NA, -6L),
class = "data.frame")