繁体   English   中英

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

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

我正在努力解决的一个概念上简单的问题。 我有随时间按 ID 分组的观察结果(“值”),并希望将每个观察结果标准化为之前的观察结果。 在下面的示例中,我可以将每个“值”标准化为 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))

使用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 

我们也可以使用headtail

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)

我们可以使用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