简体   繁体   English

如何标准化为序列中的前一个值

[英]How to normalize to the previous value in a sequence

A conceptually simple question that I'm struggling with.我正在努力解决的一个概念上简单的问题。 I have observations ('Values') grouped by ID over time and want to normalize each observation to its previous observation.我有随时间按 ID 分组的观察结果(“值”),并希望将每个观察结果标准化为之前的观察结果。 In the example below I can normalize each 'Value' to the first 'Time' observation within ID group (ie 10 to 10, 20 to 10, 30 to 10, etc) but I want to normalize each 'Value' to the previous observation (ie 20 to 10, 30 to 20, etc) and am having trouble getting it to work.在下面的示例中,我可以将每个“值”标准化为 ID 组中的第一个“时间”观察值(即 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))

Use lag to get previous value.使用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 

We can also use head and tail我们也可以使用headtail

dat %>%
  arrange(ID, Time) %>%
  group_by(ID) %>%
  mutate(ratio = c(NA, tail(Value, -1)/head(Value, -1)))

data数据

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)

We can use data.table methods我们可以使用data.table方法

library(data.table)
setDT(df1)[order(Time), ratio := Value/shift(Value), ID]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM