[英]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
我們也可以使用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)
我們可以使用data.table
方法
library(data.table)
setDT(df1)[order(Time), ratio := Value/shift(Value), ID]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.