在数据表中滚动应用以计算总和 returns NAs
rollapply in datatable to calculate sums returns NAs
我想在 R 中计算滚动总和。我正在使用此代码创建数据 table 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 的 window 为 7 的滚动总和。如果每个 ID 不可能(即没有足够的行),我只想拥有 NA。我也对其他解决方案持开放态度。
您可以使用 if
和 else
而不是 ifelse
。 ifelse(test, yes, no)
returns 与 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
我想在 R 中计算滚动总和。我正在使用此代码创建数据 table 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 的 window 为 7 的滚动总和。如果每个 ID 不可能(即没有足够的行),我只想拥有 NA。我也对其他解决方案持开放态度。
您可以使用 if
和 else
而不是 ifelse
。 ifelse(test, yes, no)
returns 与 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