0

1 つ (データフレーム 1) には日付と各日付の観測数が含まれています。他のテーブル (データフレーム 2) には、他のデータフレームよりも多くの日付があります。

私がやりたいことは、データフレーム 1 の累積合計を計算し、結果をデータフレーム 2 に配置することです。データフレーム 2 に存在するがデータフレーム 1 に存在しない日付は、単純に前日の値を持つ必要があります。

データフレーム 1

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

データフレーム 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

ご不明な点がございましたらお知らせください。どんな助けでも素晴らしいでしょう!

ありがとう、

マイク

4

1 に答える 1

2

data.tableieの devel バージョンを使用できますv1.9.5(devel バージョンをインストールする手順はhere.

最初の 'data.frame' ('df1') を 'data.table' ( ) に変換し、オプション (devel バージョンで使用可能)setDT(df1)を使用して 'df2' の 'Date' 列と結合します。oni ( ) の行インデックスで指定された「Obs」の累積合計を実行することにより、「Obs」の非 NA 要素に基づいて「Cumsum」列を作成します!is.na(Obs)。次に、na.locffromを使用して値を非 NA の以前library(zoo)の値に置き換え、「Cumsum」列を更新できます。NA'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

必要に応じて、NA「Cumsum」の値を「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][]

または別のオプションはmatchna.locf数値インデックスを取得し、非 NA インデックス (からmatch) を「Obs」の累積合計に置き換えることです。以前と同様に使用し、必要に応じて、を 0na.locfに置き換えることができます。NA

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

データ

df1 <- structure(list(Date = structure(c(16445, 16446, 16451, 16455),
class = "Date"), 
Obs = c(2L, 3L, 1L, 4L)), .Names = c("Date", "Obs"), 
row.names = c(NA, -4L), class = "data.frame")

df2 <-  structure(list(Date = structure(c(16444, 16445, 16446, 16447, 
16448, 16449, 16450, 16451, 16452, 16453, 16454, 16455, 16456
), class = "Date"), cumSum = c(0L, 2L, 5L, 5L, 5L, 5L, 5L, 6L, 
6L, 6L, 6L, 10L, 10L)), .Names = c("Date", "cumSum"), row.names = c(NA, 
-13L), class = "data.frame")
于 2015-08-21T10:43:48.990 に答える