【问题标题】:rollapply in datatable to calculate sums returns NAs在数据表中滚动应用以计算总和返回 NA
【发布时间】:2017-12-09 08:38:43
【问题描述】:

我想在 R 中计算滚动总和。我正在使用此代码创建数据表 TT:

TT <- data.table(ID=c(rep(100,9),rep(200,6)),date=seq(as.Date("1958-04-25"),as.Date("1958-05-9"),by="days"),
             output=c(5,8,NA,6,7,8,NA,12,13,2,14,12,14,14,NA))

这里我尝试计算滚动和,但结果只有 NA,即使在第一种情况(ID)中,长度应该 > 7。

TT[,XX :=
 ifelse(length(output) >= 7,
        rollapply(output, 7, sum, na.rm = TRUE,align = "right",fill = NA_real_),
        rep(NA_real_,length(output))),by=ID]

TT[,length(output),by=ID]

我想要做的是计算滚动总和,如果可能的话,每个 ID 的窗口为 7。如果每个 ID 不可能(即行数不够),我只想拥有 NA。我也愿意接受其他解决方案。

【问题讨论】:

  • zoo 的开发版本可以处理比width= 参数短的系列。 install.packages("zoo", repos="http://R-Forge.R-project.org"); TT[, XX := rollapplyr(output, 7, sum, na.rm = TRUE, fill = NA_real_), by = ID]
  • 哦,太好了!谢谢提示

标签: r datatable zoo


【解决方案1】:

您可以使用ifelse 代替ifelseifelse(test, yes, no) 返回一个与test 形状相同的值,结果的模式可能取决于test 的值。

TT[, XX := if(length(output) >= 7) rollapply(output, 7, sum, na.rm = TRUE, align = "right", fill = NA_real_) else rep(NA_real_, length(output)), by = ID]

     ID       date output XX
 1: 100 1958-04-25      5 NA
 2: 100 1958-04-26      8 NA
 3: 100 1958-04-27     NA NA
 4: 100 1958-04-28      6 NA
 5: 100 1958-04-29      7 NA
 6: 100 1958-04-30      8 NA
 7: 100 1958-05-01     NA 34
 8: 100 1958-05-02     12 41
 9: 100 1958-05-03     13 46
10: 200 1958-05-04      2 NA
11: 200 1958-05-05     14 NA
12: 200 1958-05-06     12 NA
13: 200 1958-05-07     14 NA
14: 200 1958-05-08     14 NA
15: 200 1958-05-09     NA NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多