日付と値のデータフレームがあり、正の数値のみの場合は累積、負の場合は累計が必要です。日付は同じ日付を複数回持つことがあり、数日が欠けている(値がない=行がない)日付で指定されたデータフレームの特定の数値の累積合計
最初は累積合計をテストしました。これらは、日付の順に累積的ではなく、あった。
:df$cumsum <- cumsum(df$values)
# or
df$cumsum <- ave(df$values, FUN=cumsum)
# Should cumulate by date but did not in right order
df$cumsum <- cumsum(df[order(df$date, df$values), "values"])
は最後に、私は(ない本当に私はデータフレーム中でやってみたかったが、仕事をしていませんよう)望んでいたとして、最初のステップを行い解決策を見つけました
dt <- data.table(df)
dt[order(date), cumsum := cumsum(values)]
素晴らしいですが、値> 0をフィルタリングするすべての試みがうまくいかなかった。最後に、データをサブセット化して結果を得ましたが、実際には私が望んでいたものではありません。
df["cumsum_pos"] = df["values"][df["values"] > 0].cumsum()
df["cumsum_neg"] = df["values"][df["values"] < 0].cumsum()
/編集
df <- data.frame(date = as.Date(c("2016-12-08", "2016-12-07", "2016-12-05", "2017-01-05",
"2017-01-10", "2017-01-11", "2017-01-11")),
values = c(10, -10, 5, 5, -7, 8, 8))
# just the cumsum
# expected output = c(5, -5, 5, 10, 3, 11, 19)
df$cumsum <- cumsum(df$values)
# output = c(10, 0, 5, 10, 3, 11, 19)
df$cumsum <- ave(df$values, FUN=cumsum)
# output = c(10, 0, 5, 10, 3, 11, 19)
df$cumsum <- cumsum(df[order(df$date, df$values), "values"])
# output = c(5, -5, 5, 10, 3, 11, 19) correct in this example
# doesn't work with dates in a different order 2016-12-31, 2016-12-30, ... 2015-12-31, 2015-12-30
# Now for just the positives
# expected output = c(10, 0, 5, 15, 15, 23, 31)
df$cumsum.pos[df$values > 0] <- cumsum(df[order(df$date, df$values), "values"][df$values > 0])
# output = c(5, NA, 15, 20, NA, 28, 36)
# And then the same with just the negatives
/編集
ニコラス:
dt.pos <- data.table(subset(df, values> 0))
dt.pos[order(date), cumsum := cumsum(values)]
dt.neg <- data.table(subset(df, values < 0))
dt.neg[order(date), cumsum := cumsum(values)]
私は(注文したデータフレーム付き)Pythonの同等のような単純なものを探していますコメントで正しい出力が得られない
df<-df[order(df$date),]
# values = c(5, -10, 10, 5, -7, 8, 8)
# expected output = c(5, 5, 15, 20, 20, 28, 36)
df$cumsum<-ave(df$values,df$values>0,FUN=cumsum)
# output = c(5, -10, 15, 20, -17, 28, 36)
小さな再現可能な例を示してくださいと予想される出力 – akrun
まず順あなたdata.frame: 'DF <-df [オーダー(DFの$日付)、]' 'そしてave'を使用:df $ cumsum <-ave(df $ value、df $ value> 0、FUN = cumsum) ' – nicola
残念ながら、それはネガも追加しているので、それは正しい方向への一歩ですが、私は思っています。 – sezi80