计算R数据帧中每个ID的每日差异

计算R数据帧中每个ID的每日差异,r,R,我有一个类似这样的数据帧: 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 我想添加一列“与前一天的差异”。如您所见,表中并

我有一个类似这样的数据帧:

    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
我想添加一列“与前一天的差异”。如您所见,表中并非所有对象直到最后一天才有值,有时一天内有多个测量值(B2),应通过取平均值进行总结

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


额外问题:测量并不总是在一天中的同一时间进行,因此事实上,day列是一个浮动(实验开始后2.4553天)。没有必要以任何方式对差异进行标准化,因为生成的差异最终将以X轴上的Day[Float]为绘图,但如果有一个不依赖Day-1来查找上一个条目的解决方案,那就太好了。

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

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

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

df假设您的数据帧名为“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
库(dplyr)
产量%
分组依据(ID,日期)%>%
总结(值=平均值))%>%#确保每天/ID只有一个值
mutate(PrevValue=lag(value,n=1),#创建前几天值的列
DiffToPreviousDay=PrevValue-Value)#计算差异
如果一天是浮动的,而不是寻找与前一天的差异,您希望与前一观察结果的差异,那么只需省略总结:

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
库(dplyr)
产量%
分组依据(ID,日期)%>%
mutate(PrevValue=lag(value,n=1),#创建前几天值的列
DiffToPreviousObservation=PrevValue-Value)#计算差异

我喜欢这个!绘制第7行的差值为0有点危险。。。
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