此问题是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
现在,我的问题是:
如何将此结果附加到表格中(在99.99%列之后)?
如何计算每个端口的峰值流量(流量/秒)?即,Port1在2016/02/05 15:18:25有14个流量,在2016/02/05 15:18:26有3个流量,在2016/02/05 15:18:27有1个流量,所以它的峰值,我在这个地方需要14号。
希望我能够清楚地描述我的问题。非常感谢您的耐心和善意的回应。
更新: 我发现了一种丑陋的方法,即分别计算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函数在延迟后附加峰值。它看起来很难看。需要专家的建议。非常感谢。
答案 0 :(得分:0)
如果您只是希望能够将现在的内容整合到一起,@ Alex关于在您的问题的第二个代码块中修改匿名函数调用的评论将为您完成工作。但是,为了帮助您更长远,我建议将您的表格转换为数据框架。 It's practically crying out to be one anyway
将新列添加到数据框d
非常容易;只需使用d$new_column_name <- vector_of_values
或d[,"new_column_name"] <- vector_of_values
。
你也可以转换@krun教你如何使用t
制作数据框的表as.data.frame(t)
并将两者粘合在一起:只要两个数据帧a
和b
具有相同的行数,cbind(a, b)
将生成包含a
和b
列的数据表。 (作为旁注,为了清晰和可读的代码,不要使用t
作为对象的名称,因为t
也是转置函数的名称)。< / p>