将频率表限制为每个唯一ID一个条目

时间:2014-05-13 16:38:13

标签: r csv statistics

我有一个跟踪脚本生成的错误代码的数据框。每次执行脚本时,它都会将记录添加到大量CSV文件中。每次运行脚本时,event_id字段都是唯一的。每次运行可以添加CRITICAL,ERROR,WARNING,DIAGNOSTIC或INFORMATION消息的多种组合以及附带的值和附加信息(为简单起见,此处未表示)。

我需要总结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

我确实尝试过搜索,但甚至不知道要搜索哪些关键字。因此,即使您无法回答这个问题,我也会感谢您对搜索查询的任何帮助。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用classevent_id变量构建二维表,使用pmin将该值限制为1,然后使用rowSums把它带回一维表:

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

答案 2 :(得分:0)

您可以split按事件ID分类然后创建数据框。

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