【问题标题】:Conditional sum data.table in R [duplicate]R中的条件和data.table [重复]
【发布时间】:2016-02-23 13:09:07
【问题描述】:

我尝试实现以下看起来像this question from me 但不一样的东西。如果日期大于该行上的日期,我想求和并表示来自同一 id 的所有值。对于第 3 行,这意味着:61+61+57=179 和第 4 行:61+57=118 对于相同行的平均值:(61+61+57)/3, (51+57)/2

或额外列的加权平均值。

library(data.table)
set.seed(123)
DT<-data.table(date=rep(c(2015:2020),3),
               value=round(runif(18,20,120)),
               id=rep(c("a","b","c"),each=6))

DT
    date value id
 1: 2015    52  a
 2: 2016    43  a
 3: 2017    34  a
 4: 2018    61  a
 5: 2019    61  a
 6: 2020    57  a
 7: 2015    35  b
 8: 2016    34  b
 9: 2017    43  b
10: 2018    67  b
11: 2019    47  b
12: 2020   106  b
13: 2015    25  c
14: 2016    64  c
15: 2017   100  c
16: 2018    32  c
17: 2019    76  c
18: 2020    41  c

我试过了:

DT[,sum_value:=sum(value[date>date[1]]),by=id]

但这不起作用。非常感谢任何帮助。

【问题讨论】:

  • 在一个 id 中是否出现重复日期?
  • 一个id内不能有重复的日期。

标签: r data.table aggregate


【解决方案1】:

假设每个 id 没有重复的日期,并且如果您不需要初始订单,则可以使用:

setorder(DT, id, -date)
DT[, x := cumsum(value)-value, by = id]

要计算以前日期的mean,您可以使用:

DT[, z := (cumsum(value)-value)/(seq_len(.N)-1L), by = id]

【讨论】:

  • 我也有同样的想法,不错。
  • 谢谢。如果它不是一个总和,而是一个平均值或加权平均值。这将如何运作?
  • @Tim_Utrecht,你能用一个例子更新你的问题吗?我不确定预期的输出
  • @Tim_Utrecht,我认为最好对您的问题进行更准确的描述(和功能示例)并提出一个新问题,因为该问题已关闭
猜你喜欢
  • 2020-09-12
  • 2020-09-16
  • 2018-08-13
  • 2015-10-06
  • 2020-12-21
  • 2015-04-29
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
相关资源
最近更新 更多