R:缺少日期的累计金额

时间:2015-08-21 10:34:11

标签: r cumsum

我有两个数据帧,一个(数据帧1)包含日期和每个日期的一些观察结果。在另一个表格(数据框2)中,我有更多日期,而不是我在其他数据框中的日期。

我想要做的是计算数据帧1的累积总和,并将结果放在数据帧2中。数据帧2中存在但数据帧1中没有的任何日期应该只具有前一天的值

Dataframe 1

Date        Obs  
2015-01-10  2  
2015-01-11  3  
2015-01-16  1  
2015-01-20  4  

Dataframe 2

Date       cumSum
2015-01-09  0
2015-01-10  2
2015-01-11  5
2015-01-12  5
2015-01-13  5
2015-01-14  5
2015-01-15  5
2015-01-16  6
2015-01-17  6
2015-01-18  6
2015-01-19  6
2015-01-20 10
2015-01-21 10

如果有任何不清楚的地方,请告诉我。 任何帮助都会很棒!

谢谢,

麦克

1 个答案:

答案 0 :(得分:2)

我们可以使用data.table的devel版本,即v1.9.5(安装devel版本的说明为here

我们将第一个'data.frame'('df1')转换为'data.table'(setDT(df1)),使用on选项加入'df2'的'Date'列(可在devel版本中获得)。我们通过执行i(!is.na(Obs))中行索引指定的'Obs'的累积和,基于'Obs'中的非NA元素创建'Cumsum'列。然后,我们可以使用na.locf中的library(zoo)NA值替换为非NA之前的值,并更新“Cumsum”列。由于'Obs'列不在预期输出中,我们可以将它(:=)分配给NULL。

library(data.table)#v1.9.5+
library(zoo)
res <- setDT(df1)[df2['Date'], on='Date'][!is.na(Obs), Cumsum:=cumsum(Obs)
           ][, Cumsum:=na.locf(Cumsum, na.rm=FALSE)][, Obs := NULL]
res
#         Date Cumsum
# 1: 2015-01-09     NA
# 2: 2015-01-10      2
# 3: 2015-01-11      5
# 4: 2015-01-12      5
# 5: 2015-01-13      5
# 6: 2015-01-14      5
# 7: 2015-01-15      5
# 8: 2015-01-16      6
# 9: 2015-01-17      6
#10: 2015-01-18      6
#11: 2015-01-19      6
#12: 2015-01-20     10
#13: 2015-01-21     10

如果需要,我们可以将'Cumsum'中的NA值替换为'0'

res[is.na(Cumsum), Cumsum:=0]

或者正如@Khashaa在评论中提到的那样,我们可以使用na.locf

在没有roll=Inf的情况下执行此操作
 setDT(df1)[,cumSum:=cumsum(Obs),][df2['Date'],
                       on='Date',roll=Inf][, Obs:= NULL][]

或另一个选项是match na.locf来获取数字索引并将非NA索引(来自match)替换为'Obs'的累积和,使用{{如前所述,如果需要,我们可以将na.locf替换为0。

NA

数据

df2$Cumsum <- na.locf(cumsum(df1$Obs)[match(df2$Date, df1$Date)], na.rm=FALSE)
相关问题