2015-12-08 88 views
1

我有一個txt數據文件列表。它們中的每一個都是參與者在一組任務中採取的所有行動的記錄。對一個任務一個例子一塊數據是:計算R中其他字符串前面的字符串數

[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..." 

現在,我的列表中的每個元素我需要的,只有當它的「成功之後出現計數的時間顯示「不錯的選擇」的消息,但數「,所以我需要計算一個人犯下錯誤併成功糾正錯誤的實例的數量(數據從底部保存到頂部,所以更新的事件高於舊的事件)。

其次,程序中有一些入侵者任務是隨機激活的,並且可能以「入侵者...」(例如「入侵者B已啓動」)開始的消息可能出現在「不良選擇」和「成功」消息(上例中不是這種情況,但它可能發生在數據中)。所以我還需要包含兩個消息之間出現「入侵者...」消息(但不包括其他消息)的實例。

我將不勝感激關於如何處理這個問題最好的方法。

+0

除去前期的入侵者( '不錯的選擇',your_data [grep的( '成功',your_data)+ 1],值= TRUE)'來檢查行之前或之後(更改爲-1)的成功... – drmariod

+0

如果你不想使用你不明白的單線程,只是循環你的數據,當你成功時,檢查下一個是否是一個不好的選擇。如果是,請增加你的櫃檯。在R中這樣做並不是一種高效的方式,但它是實現它的算法直接方式,您應該可以編寫它...使用'grep'來檢查一行是否包含「success」或「bad choice」或「入侵者」。坦率地說,如果你不知道如何處理這個簡單的問題,你應該怎麼做才能做出一個好的和簡單的循環。 –

+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) 

第二部分可能是相似的,只是傳播一行到severals,在您檢查您的「入侵者」,如果是這樣,只需添加或減去1

由於antoine-sac的建議評論,你可以如何使用`grep的如何使用

tmp <- lines[!grepl(lines, "^intruder.+started$"] 
grep('bad choice', tmp[grep('success', tmp) + 1], value=TRUE) 
+1

如果你剛纔刪除了入侵者(像'tmp < - lines [!grepl(lines,「^ intruder。+ started $」]'),你的代碼完全可以在'tmp'上解決問題。 –

+0

你@你的解決方案完美地工作@ antoine-sac,我按照你的建議移除了入侵者,並且使得整個事情變得非常簡單! – Ewa

+1

@Ewa:如果它解決了你的問題,請考慮接受解決方案(左邊大剔的答案)。 –