在 R 中解析文件:跟踪一段时间内没有时间戳的事件



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

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

我需要做的是跟踪某些事件发生时的事件。我想收到这样的表:

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

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

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

如果我不得不削减它:如何让 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")

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

您可以将会话与一系列事件相关联,但不能一次完成所有
事件。

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

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

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

继续操作,直到解析整个文件。
仅此而已。


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

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

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

最新更新