[英]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
我们也可以使用
head
和tail
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.