0

[更新:试图澄清和简化,更正示例代码和数据。]

我有一组在几天内进行的测量。在任何测量中可以捕获的数字范围是 1-25(在现实生活中,给定测试集,范围可能高达 100 或低至 20)。

我想要一种方法来计算自发生特定数字以来已经过去了多少事件,而不管测量列如何。我希望它在数字匹配后重置计数,如下所示。

V1,V2,Vn 是捕获的值。Match1、Match2、Matchn 是自上次遇到列以来的计数。

注意:无论遇到哪个 Vx 列 n,Matchn 计数都会递增。

任何帮助深表感谢。

与我之前的帖子有点相关

样本输入

library(data.table)
t <- data.table(
  Date = as.Date(c("2013-5-1", "2013-5-2", "2013-5-3", "2013-5-4", "2013-5-5", "2013-5-6", "2013-5-7", "2013-5-8", "2013-5-9", "2013-5-10")),
  V1 = c(4, 2, 3, 1,7,22,35,3,29,36),
  V2 = c(2, 5, 12, 4,8,2,38,50,4,1)
)

用于创建示例输出的代码

t$match1 <- c(1,2,3,4,1,2,3,4,5,1)
t$match2 <- c(1,1,2,3,4,5,1,2,3,4)
t$match3 <- c(1,2,3,1,2,3,4,5,1,2)

> t
          Date V1 V2 match1 match2 match3
 1: 2013-05-01  4  2      1      1      1
 2: 2013-05-02  2  5      2      1      2
 3: 2013-05-03  3 12      3      2      3
 4: 2013-05-04  1  4      4      3      1
 5: 2013-05-05  7  8      1      4      2
 6: 2013-05-06 22  2      2      5      3
 7: 2013-05-07 35 38      3      1      4
 8: 2013-05-08  3 50      4      2      5
 9: 2013-05-09 29  4      5      3      1
10: 2013-05-10 36  1      1      4      2
4

1 回答 1

2

我认为 OP 中有一堆错别字,据我了解,你想要这个:

t <- data.table(
  Date = as.Date(c("2013-5-1", "2013-5-2", "2013-5-3", "2013-5-4", "2013-5-5", "2013-5-6", "2013-5-7", "2013-5-8", "2013-5-9", "2013-5-10")),
  V1 = c(4, 2, 3, 1,7,22,35,52,29,36),
  V2 = c(2, 5, 2, 4,8,47,38,50,4,1)
)

t[, inclusive.match.1 := 1:.N, by = cumsum(V1 == 1 | V2 == 1)]
t[, exclusive.match.1 := 1:.N, by = rev(cumsum(rev(V1 == 1 | V2 == 1)))]
t
#          Date V1 V2 inclusive.match.1 exclusive.match.1
# 1: 2013-05-01  4  2                 1                 1
# 2: 2013-05-02  2  5                 2                 2
# 3: 2013-05-03  3  2                 3                 3
# 4: 2013-05-04  1  4                 1                 4
# 5: 2013-05-05  7  8                 2                 1
# 6: 2013-05-06 22 47                 3                 2
# 7: 2013-05-07 35 38                 4                 3
# 8: 2013-05-08 52 50                 5                 4
# 9: 2013-05-09 29  4                 6                 5
#10: 2013-05-10 36  1                 1                 6
于 2013-08-14T14:52:10.350 回答