我有一个txt数据文件列表。它们中的每一个都是参与者在一组任务中所采取的所有行动的记录。一项任务的一个示例数据是:
[245] "2015-02-20 11:11:02| 134602| end of mat task (passed: 4/5)"
[246] "2015-02-20 11:11:02| 134599| step E9 abandoned - skipping to next"
[247] "2015-02-20 11:11:01| 133596| step E9 bad choice - error limit reached"
[248] "2015-02-20 11:10:47| 120007| intruder D started"
[249] "2015-02-20 11:10:47| 119792| step E9 bad choice"
[250] "2015-02-20 11:10:38| 110857| step E9 started"
[251] "2015-02-20 11:10:37| 109844| step E1 success"
[252] "2015-02-20 11:10:28| 101030| step E1 started"
[253] "2015-02-20 11:10:27| 100018| step D10 success"
[254] "2015-02-20 11:10:07| 79625| step D10 started"
[255] "2015-02-20 11:10:06| 78609| step C12 success"
[256] "2015-02-20 11:10:02| 74713| step C12 bad choice"
[257] "2015-02-20 11:09:50| 62673| step C12 started"
[258] "2015-02-20 11:09:49| 61642| step B8 success"
[259] "2015-02-20 11:09:47| 60003| intruder B started"
[260] "2015-02-20 11:09:33| 46047| step B8 started"
[261] "2015-02-20 11:09:33| 46032| mats: B8,C12,D10,E1,E9"
[262] "2015-02-20 11:09:33| 46032| mat task: B8,C12,D10,E1,E9 displayed..."
现在,对于我列表中的每个元素,我需要计算"错误选择"显示消息,但只有当它出现在" success"之后,所以我需要计算一个人犯了错误并成功纠正它的实例数(数据从底部保存到顶部,所以更新事件高于旧事件。)
其次,程序中有一些入侵者任务被随机激活,并且可能是以"入侵者开始的消息......" (例如"入侵者B开始")可能出现在"糟糕的选择"和"成功"消息(在上面的示例中不是这种情况,但它可能发生在数据中)。所以我还需要包含"入侵者的实例......"消息(但不是其他消息)出现在相关的两条消息之间。
我很感激有关如何以最佳方式处理此问题的任何提示。
答案 0 :(得分:1)
这里有一些虚拟数据......应该让你对问题的第一部分有所了解。
lines <- c("2015-02-20 11:11:02| 134602| end of mat task (passed: 4/5)",
"2015-02-20 11:11:02| 134599| step E9 abandoned - skipping to next",
"2015-02-20 11:11:01| 133596| step E9 bad choice - error limit reached",
"2015-02-20 11:10:38| 110857| step E9 started",
"2015-02-20 11:10:37| 109844| step E1 success",
"2015-02-20 11:10:02| 74713| step C12 bad choice")
grep('bad choice', lines[grep('success', lines) + 1], value=TRUE)
第二部分可能类似,只是将一行分成几行,在那里你检查你的&#34;入侵者&#34;如果是这样,只需添加或减去1。
在评论中建议antoine-sac
,您可以使用
tmp <- lines[!grepl(lines, "^intruder.+started$"]
grep('bad choice', tmp[grep('success', tmp) + 1], value=TRUE)