在 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.table
和zoo
包:
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")
我有一个 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.table
和zoo
包:
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")