Используйте lag
для получения предыдущего значения.
library(dplyr)
dat %>%
arrange(ID, Time) %>%
group_by(ID) %>%
mutate(ratio = Value/lag(Value))
# ID Time Value ratio
# <fct> <dbl> <int> <dbl>
# 1 A 10 53 NA
# 2 A 20 16 0.302
# 3 A 30 57 3.56
# 4 A 40 74 1.30
# 5 B 10 38 NA
# 6 B 20 54 1.42
# 7 B 30 61 1.13
# 8 C 10 78 NA
# 9 C 20 41 0.526
#10 C 30 83 2.02
Мы также можем использовать head
и tail
dat %>%
arrange(ID, Time) %>%
group_by(ID) %>%
mutate(ratio = c(NA, tail(Value, -1)/head(Value, -1)))
данные
ID <- c(rep("A", 4), rep("B", 3), rep("C", 3))
Time <- c(10, 20, 30, 40, 10, 20, 30, 10, 20, 30)
Value <- sample(1:100, 10)
dat <- data.frame(ID, Time, Value)