在 R 中解析文件:随时间推移跟踪没有时间戳的事件

Parsing a file in R: Tracking events over time with no timestamp

我有一个 txt 文件,我在 R 中对其进行解析以从中获取一些统计信息。它看起来像这样:

**New Session**
Event A
Event B
Event B
Event C
Event A
Event C
...
**New Session**
...
**New Session**
...

我需要做的是在某些事件发生时对其进行跟踪。我想收到这样的 table:

Event A | Session 1
Event A | Session 1
Event A | Session 2
Event A | Session 3

我在解析方面没有问题,但我不知道如何将各个事件连接到它们发生的会话。没有我可以使用的时间戳。

一种方法可能是将文件剪切为包含一个会话的单个文本文件。但我打赌有一种方法可以在解析特定事件时计算会话数?

如果我不得不将其分解:如何让 R 为特定字符串解析一行中的所有文件?

我不确定 R 是否支持断言和内联修饰符。
将假设它确实是为了这个目的。

你可以将一个会话与一系列事件联系起来,但你不能做到全部
立刻。

您需要一个通用的正则表达式来捕获每个会话和所有关联的事件
那个 会话。
这个 (?ms)^(\*\*New[ ]Session\*\*)((?:(?!^).)*) 就是它,你 运行 全局
在一个 while 循环中。

 (?ms)                         # Modifiers:  multi-line and dot-all
 ^                             # Beginning of line
 ( \*\*New [ ] Session\*\* )   # (1), The sessions info, specify
 (                             # (2 start), All the Events
      (?:
           (?! ^  )                    # Assert, not a new session
           . 
      )*
 )                             # (2 end)

在每场比赛中,第 1 组是会话,第 2 组是 所有 个事件。
将会话存储在一个结构中,然后为所有个体解析第 2 组
您可以添加到结构中的事件。

继续,直到分析完整个文件。
这里的所有都是它的。


如果您需要将所有会话与事件
相关联 哈希最适合。

就像我说的,我不知道 R,但即使你只有列表也可以做到。

对于哈希,在每次匹配时,解析事件,然后将会话附加到
事件 哈希键的值数组。

不同类型的数据混合在数据文件的一列中的情况并不少见。只要可以通过某种方式(例如通过正则表达式)识别不同类型的数据,就可以将行的内容移动到不同的列。这里使用了data.tablezoo包:

library(data.table)
dt[V1 == "**New Session**", session := paste("Session", seq_len(.N))]
dt[, session := zoo::na.locf(session)]
dt[V1 != "**New Session**", .(event = V1, session)][order(event, session)] 
      event   session
# 1: Event A Session 1
# 2: Event A Session 1
# 3: Event A Session 2
# 4: Event A Session 2
# 5: Event A Session 3
# 6: Event B Session 1
# 7: Event B Session 1
# ...

说明

  • 首先,确定指示新会话开始的行。仅在这些行中,列 session 填充了指示会话编号的字符串。会话在源文件中出现时按顺序编号。不需要日期。
  • 现在,session 列为空的所有后续行 (NA) 都填充了上面的会话编号(locf 表示 最后一次观察转发).
  • 最后,指示新会话开始的行将被忽略,仅在第一列中保留事件。此列已相应重命名,整个 data.table 按事件在前、会话号在后排序。

可重现的数据

dt <- fread("**New Session**
            Event A
            Event B
            Event B
            Event C
            Event A
            Event C
            **New Session**
            Event A
            Event B
            Event B
            Event C
            Event A
            Event B
            **New Session**
            Event A
            Event B
            Event D
            Event D
            Event B
            Event C
            ", header = FALSE, sep = "\n")