从数据文件生成复杂的表

时间:2016-02-10 15:54:27

标签: r

此问题是How can I sum rows that with non-numeric factor in R?的扩展。我在data.txt中的数据框看起来像:

        Latency     Port        TrafficType     Time
    1   27821       Port1       ssh     "2016/02/05 15:18:25"
    2   24186       Port1       http    "2016/02/05 15:18:25"
    3   17963       Port1       ssh     "2016/02/05 15:18:25"
    4   20208       Port1       ftp     "2016/02/05 15:18:25"
    5   20703       Port2       ftp     "2016/02/05 15:18:25"
    6   29735       Port3       ssh     "2016/02/05 15:18:25"
    7   20975       Port1       https   "2016/02/05 15:18:25"
    8   29489       Port1       ssh     "2016/02/05 15:18:25"
    9   19319       Port4       ssh     "2016/02/05 15:18:25"
    10  18224       Port1       ssh     "2016/02/05 15:18:25"
    11  17952       Port1       ftp     "2016/02/05 15:18:25"
    12  17972       Port1       ssh     "2016/02/05 15:18:25"
    13  17300       Port1       ssh     "2016/02/05 15:18:25"
    14  20937       Port1       ssh     "2016/02/05 15:18:25"
    15  18769       Port1       ssh     "2016/02/05 15:18:25"
    16  18104       Port2       ssh     "2016/02/05 15:18:25"
    17  17496       Port2       ssh     "2016/02/05 15:18:26"
    18  23268       Port1       https   "2016/02/05 15:18:26"
    19  19457       Port1       ssh     "2016/02/05 15:18:26"
    20  20937       Port1       ssh     "2016/02/05 15:18:25"
    21  18769       Port1       ssh     "2016/02/05 15:18:25"
    22  18104       Port2       ssh     "2016/02/05 15:18:25"
    23  17496       Port2       ssh     "2016/02/05 15:18:26"
    24  23268       Port1       https   "2016/02/05 15:18:26"
    25  19457       Port1       ssh     "2016/02/05 15:18:27"
    ....

我使用tapply()来做一些统计:

data <- read.table("data.txt")
fact <- factor(data$Port)
lat <- tapply(data$Latency, fact,
           function(x) {
               c(max(x),
                 mean(x),
                 median(x),
                 quantile(x, c(0.90,0.99,0.9999)))
           })

然后我得到了:

    $Port1
                                    90%      99%   99.99% 
    29489.00 20941.78 19832.50 25276.50 29205.44 29486.16 

    $Port2
                                    90%      99%   99.99% 
    20703.00 18380.60 18104.00 19663.40 20599.04 20701.96 

    $Port3
                           90%    99% 99.99% 
     29735  29735  29735 29735  29735  29735 

    $Port4
                           90%    99% 99.99% 
     19319  19319  19319 19319  19319  19319

我想在上表中添加更多统计信息,例如:

    $Port1
                                   90%      99%   99.99% ftp http https ssh peak
    29489.00 20941.78 19832.50 25276.50 29205.44 29486.16 2   1   3     12   14

    $Port2
                                    90%      99%   99.99% ftp http https ssh peak
    20703.00 18380.60 18104.00 19663.40 20599.04 20701.96 1    0     0    4    3

    $Port3
                           90%    99% 99.99% ftp http https ssh peak
     29735  29735  29735 29735  29735  29735 ?   ?    ?     ?   ?

    $Port4
                           90%    99% 99.99% ftp http https ssh peak
     19319  19319  19319 19319  19319  19319 ?   ?    ?     ?   ?

昨天,我在How can I sum rows that with non-numeric factor in R?询问,感谢@akrun教我一种方法,在数据子集上应用table()函数来获取所有流量类型的计数:

     t <- table(data[c("Port", "TrafficType")])
     t
                    TrafficType
     Port    ftp http https ssh
      Port1   2    1     3  12
      Port2   1    0     0   4
      Port3   0    0     0   1
      Port4   0    0     0   1

现在,我的问题是:

  1. 如何将此结果附加到表格中(在99.99%列之后)?

  2. 如何计算每个端口的峰值流量(流量/秒)?即,Port1在2016/02/05 15:18:25有14个流量,在2016/02/05 15:18:26有3个流量,在2016/02/05 15:18:27有1个流量,所以它的峰值,我在这个地方需要14号。

  3. 希望我能够清楚地描述我的问题。非常感谢您的耐心和善意的回应。

    更新: 我发现了一种丑陋的方法,即分别计算msg率:

        rate_df <- as.data.frame(data[c("Port", "Time")])
        rate_fc <- factor(rate_df$Port)
        peak <- tapply(rate_df$Freq, rate_fc, max) # <-
    

    然后使用print函数在延迟后附加峰值。它看起来很难看。需要专家的建议。非常感谢。

1 个答案:

答案 0 :(得分:0)

如果您只是希望能够将现在的内容整合到一起,@ Alex关于在您的问题的第二个代码块中修改匿名函数调用的评论将为您完成工作。但是,为了帮助您更长远,我建议将您的表格转换为数据框架。 It's practically crying out to be one anyway

将新列添加到数据框d非常容易;只需使用d$new_column_name <- vector_of_valuesd[,"new_column_name"] <- vector_of_values

你也可以转换@krun教你如何使用t制作数据框的表as.data.frame(t)并将两者粘合在一起:只要两个数据帧ab具有相同的行数,cbind(a, b)将生成包含ab列的数据表。 (作为旁注,为了清晰和可读的代码,不要使用t作为对象的名称,因为t也是转置函数的名称)。< / p>