【问题标题】:R data.table: Count events since last occurance (multiple, inclusive/exclusive)R data.table:计数自上次发生以来的事件(多个,包括/不包括)
【发布时间】:2014-06-26 05:00:32
【问题描述】:

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

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

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

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

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

非常感谢任何帮助。

这与我之前的帖子here有些相关

示例输入

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

【问题讨论】:

  • 我仍然不明白您是如何从这篇文章中得出match1match2match3 的值的...
  • Match1 在“当前”行中寻找 1,而不管列(V1、V2)如何。如果有 1,则 Match1 中的计数将在该事件(行)上重置为独占事件或以下事件。
  • 好的。对于 inclusive,第一次匹配发生在第 4 行。重置发生在第 5 行。第二次匹配发生在第 10 行。但是重置发生在第 10 行...您如何决定是否重置在同一行或下一行(目前仅包含)?
  • t 是一个真的不好的变量名称。查找?t! :-)
  • 附注 - 使用 t[, match1 := ...] 而不是 t$match1 = ...

标签: r count data.table


【解决方案1】:

我认为 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

【讨论】:

  • 有没有办法在所有 matchx 列中做到这一点?
  • @eAndy sure, use a loop (pick range appropriately): for (i in 1:3) t[, paste0('inclusive.match.', i) := 1:.N, by = cumsum(V1 == i | V2 == i)]
猜你喜欢
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2012-01-23
  • 2023-01-01
  • 2022-06-17
相关资源
最近更新 更多