我想计算过去 d 天内与前一个 num
不相等的 num
的数量,最好是 data.table .
我的数据如下所示:
d <- 3
df1 <- structure(list(LET = structure(c(1L, 1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 2L),
.Label = c("a", "b"), class = "factor"),
day = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L),
num = c(5, 6, 6, 7, 7, 1, 1, 3, 1, 1)),
class = c("data.table", "data.frame"),
row.names = c(NA, -10L))
LET day num
1: a 1 5
2: a 2 6
3: a 3 6
4: a 4 7
5: a 5 7
6: b 1 1
7: b 2 1
8: b 3 3
9: b 4 1
10: b 5 1
而且我可以用 shift 来表示 num
是否等于其滞后值,无论 num
是否已更改:
df1[,hasChanged := num!=shift(num, n=1, fill=FALSE), by='LET']
但我想通过 LET
计算 day <= currentRowDay & day > currentRowDay - d 的 num
更改次数。
输出如下所示(hasChanged 列是可选的):
df1[,NumberOfChangesPast3Days := c(1,2,2,2,1,1,1,2,2,2),]
LET day num hasChanged NumberOfChangesPast3Days
1: a 1 5 TRUE 1
2: a 2 6 TRUE 2
3: a 3 6 FALSE 2
4: a 4 7 TRUE 2
5: a 5 7 FALSE 1
6: b 1 1 TRUE 1
7: b 2 1 FALSE 1
8: b 3 3 TRUE 2
9: b 4 1 TRUE 2
10: b 5 1 FALSE 2
最佳答案
一个可能的解决方案是使用 Reduce
和 shift
:
df1[, N_Changes := Reduce(`+`, shift(hasChanged, n = 0:(d-1), fill = FALSE))
, by = LET]
给出:
> df1 LET day num hasChanged N_Changes 1: a 1 5 TRUE 1 2: a 2 6 TRUE 2 3: a 3 6 FALSE 2 4: a 4 7 TRUE 2 5: a 5 7 FALSE 1 6: b 1 1 TRUE 1 7: b 2 1 FALSE 1 8: b 3 3 TRUE 2 9: b 4 1 TRUE 2 10: b 5 1 FALSE 2
关于r - 统计过去 n 天内值变化的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60587955/