【问题标题】:Calculate Daily Difference per ID in R Dataframe [duplicate]计算R Dataframe中每个ID的每日差异[重复]
【发布时间】:2020-01-08 11:56:24
【问题描述】:

我有一个看起来像这样的数据框:

    ID    Day  Value
    A     1    1.4
    A     2    3.4
    A     3    5.6
    A     4    6.7
    B     1    2.3
    B     2    3.4
    B     2    3.5
    C     1    2.3
    C     2    4.6
    C     3    6.8

我想添加一列“与前一天的差异”。如您所见,并非表中的所有 Objects 直到最后一天都有值,有时一天会有多个测量值 (B2),应该通过取平均值来总结。

在 R 中做这件事的好方法是什么?我现在正在使用一个循环来遍历每一行并找到前一天的匹配行,但这需要很长时间并且不觉得你应该这样做。

额外问题:测量并不总是在一天中的同一时间进行,因此实际上 Day 列是一个浮点数(从实验开始算起 2.4553 天)。没有必要以任何方式对差异进行归一化,因为生成的差异最终会出现在 X 轴上 Day[Float] 的图中,但如果有一个不依赖 Day 的解决方案会很好 - 1 用于查找上一个条目。

【问题讨论】:

    标签: r


    【解决方案1】:

    假设您的数据框名为“df”,则使用 dplyr 回答:

    library(dplyr)
    
    output <- df %>% 
      group_by(ID, Day) %>% 
      summarise(Value = mean(Value)) %>% # ensure only 1 Value per Day/ID
      mutate(PrevValue = lag(value, n=1), # create column that is previous days value                            
             DiffToPreviousDay = PrevValue - Value) # calculate difference
    

    如果 day 是一个浮点数,而不是查找与前一天的差异,您想要与前一个观察结果的差异,然后简单地省略摘要:

    library(dplyr)
    
    output <- df %>% 
      group_by(ID, Day) %>% 
      mutate(PrevValue = lag(value, n=1), # create column that is previous days value                            
             DiffToPreviousObservation = PrevValue - Value) # calculate difference
    

    【讨论】:

      【解决方案2】:

      也许你可以试试下面的代码,这是一个基本的 R 解决方案:

      df <- within(df,difference <- ave(ave(Value, ID, Day, FUN = mean),ID, FUN = function(x) c(NA,diff(x))))
      

      这样

      > df
         ID Day Value difference
      1   A   1   1.4         NA
      2   A   2   3.4       2.00
      3   A   3   5.6       2.20
      4   A   4   6.7       1.10
      5   B   1   2.3         NA
      6   B   2   3.4       1.15
      7   B   2   3.5       0.00
      8   C   1   2.3         NA
      9   C   2   4.6       2.30
      10  C   3   6.8       2.20
      

      数据

      df <- structure(list(ID = c("A", "A", "A", "A", "B", "B", "B", "C", 
      "C", "C"), Day = c(1L, 2L, 3L, 4L, 1L, 2L, 2L, 1L, 2L, 3L), Value = c(1.4, 
      3.4, 5.6, 6.7, 2.3, 3.4, 3.5, 2.3, 4.6, 6.8)), class = "data.frame", row.names = c(NA, 
      -10L))
      

      【讨论】:

      • 我喜欢这个!绘制第 7 行的差异为 0 有点危险......
      猜你喜欢
      • 2016-04-03
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多