【问题标题】:How to normalize to the previous value in a sequence如何标准化为序列中的前一个值
【发布时间】:2020-01-25 04:26:42
【问题描述】:

我正在努力解决的一个概念上简单的问题。我有随时间按 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))

【问题讨论】:

    标签: r dplyr normalization tidyverse plyr


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我们可以使用data.table 方法

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多