我有两个数据帧,一个(数据帧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
如果有任何不清楚的地方,请告诉我。 任何帮助都会很棒!
谢谢,
麦克
答案 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)