id的延迟差异

问题描述 投票:0回答:1

我有这样的数据集

 ID     Date        Total  
 1      2002-03-12   4.98
 1      2003-06-06   5.49
 2      2005-10-10   2.62
 2      2010-04-07   2.02
 2      2012-04-03   2.40 
 2      2014-04-10   2.45

我正在尝试通过每个ID计算Total(t + 1)和Total(t)值之间的差。

最终的预期数据集应如下

 ID     Date        Total    Delta
 1      2002-03-12   4.98    NA
 1      2003-06-06   5.49    0.51 = 5.49 - 4.98
 2      2005-10-10   2.62    NA
 2      2010-04-07   2.02    -0.6 = 2.02 - 2.62 
 2      2012-04-03   2.40    0.38 = 2.40 - 2.02
 2      2014-04-10   2.45    0.05 = 2.45 - 2.40

我在下面尝试过此方法

library(dplyr)
df %>%
   group_by(Id, Date) %>%
   arrange(Id, Date) %>%
   mutate(
     Delta = (Total - lag(Total, 1))
   )

这不起作用,我在Delta列中看到NA。任何建议或帮助深表感谢。谢谢。

r dplyr lag
1个回答
0
投票

使用data.tablediff

library(data.table)
dt <- as.data.table(read.table('clipboard', header = T))

> dt
   ID       Date Total
1:  1 2002-03-12  4.98
2:  1 2003-06-06  5.49
3:  2 2005-10-10  2.62
4:  2 2010-04-07  2.02
5:  2 2012-04-03  2.40
6:  2 2014-04-10  2.45
> dt[, delta := c(0, diff(x = Total, lag = 1))]

> dt
   ID       Date Total delta
1:  1 2002-03-12  4.98  0.00
2:  1 2003-06-06  5.49  0.51
3:  2 2005-10-10  2.62 -2.87
4:  2 2010-04-07  2.02 -0.60
5:  2 2012-04-03  2.40  0.38
6:  2 2014-04-10  2.45  0.05

我在开头(c(0, diff ...))后面加了0,因为没有什么可计算出差值。您可以将其设置为NA或其他一些值。第3行没有像问题中那样显示NA值。

© www.soinside.com 2019 - 2024. All rights reserved.