Как нормализовать предыдущее значение в последовательности - PullRequest
0 голосов
/ 25 сентября 2019

Концептуально простой вопрос, с которым я борюсь.У меня есть наблюдения («Значения»), сгруппированные по идентификатору по времени, и я хочу нормализовать каждое наблюдение к его предыдущему наблюдению.В приведенном ниже примере я могу нормализовать каждое «Значение» для первого наблюдения «Время» в пределах группы идентификаторов (т. Е. От 10 до 10, от 20 до 10, от 30 до 10 и т. Д.), Но я хочу нормализовать каждое «Значение» для предыдущего наблюдения(т. е. от 20 до 10, от 30 до 20 и т. д.), и я не могу заставить его работать.

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 <- cbind(ID, Time, Value)

newDat <- dat %>%
  arrange(Time) %>%
  group_by(ID) %>%
  mutate(ratio = Value/first(Value))

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Мы можем использовать data.table методы

library(data.table)
setDT(df1)[order(Time), ratio := Value/shift(Value), ID]
0 голосов
/ 25 сентября 2019

Используйте 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)
...