2014-05-13 25 views
1

我有一個數據框,用於跟蹤腳本生成的錯誤代碼。每次腳本執行時,它都會將記錄添加到大量的CSV文件中。每次腳本運行時,event_id字段都是唯一的。每次運行都可以將CRITICAL,ERROR,WARNING,DIAGNOSTIC或INFORMATION消息的多個組合與附加值和附加信息(此處爲簡單起見未在此處顯示)相加。將頻率表限制爲每個唯一ID的一個條目

我需要總結CSV文件中每類錯誤的數量,但是來自同一事件ID的多個錯誤應只計爲一個錯誤。這裏有一個數據結構如何的例子:

event_id | class  | value 
1  | ERROR  | 5409 
1  | ERROR  | 5410 
2  | WARNING  | 212 
3  | ERROR  | 5409 
3  | WARNING  | 400 
3  | DIAGNOSTIC | 64 

這就是我期待的輸出結果。即使有三個ERROR類事件,其中兩個與同一個事件關聯,因此它只能算作一個。

class  | count 
ERROR  | 2 
WARNING | 2 
DIAGNOSTIC | 1 

我曾嘗試尋找這一點,但甚至不知道哪些關鍵字來搜索。所以,即使你不能回答這個問題,我會很感激任何搜索查詢的幫助。

回答

0

你可以通過事件id split類然後創建一個數據幀。

> s <- sapply(split(dat$event_id, dat$class), function(x) length(unique(x))) 
> data.frame(count = s) 
##   count 
## DIAGNOSTIC  1 
## ERROR   2 
## WARNING  2 
+0

這是一個優雅的解決方案。這兩個函數都有訣竅,但是對於像我這樣的R新手來說,這樣做更容易直觀理解。謝謝您的幫助! – user3633365

0

你可以使用classevent_id變量建立一個2-d表,使用pmin在該表中的值限制爲1,然後用rowSums拿回來一個1-d表:

rowSums(pmin(table(dat$class, dat$event_id), 1)) 
# DIAGNOSITIC  ERROR  WARNING 
#   1   2   2 
+0

謝謝!這是完美的。 – user3633365

1
df = read.table(header = T, sep = "|", text = " 
      event_id | class  | value 
1  | ERROR  | 5409 
1  | ERROR  | 5410 
2  | WARNING  | 212 
3  | ERROR  | 5409 
3  | WARNING  | 400 
3  | DIAGNOSTIC | 64") 

df = as.data.table(df) 
setkey(df, event_id, class) 

unique(df)[, .N, by = class] 
#   class N 
#1: ERROR  2 
#2: WARNING  2 
#3: DIAGNOSTIC 1 
相關問題