所以我已经做到了这一点(效率低下),但为了将来参考,我想知道是否有更好的方法。
我正在做的是绘制数据包的数量,以及跟踪中每秒发送的数据。代码目前是:
trace$sec = cut(trace$V1, breaks = seq(0, 1800, by = 1), labels = 1:1800)
packet_count_vec = numeric()
data_trans_vec = numeric()
for (i in 0:1800 ) {
print(i)
bin = which(trace$sec == i)
packet_count = 0
data_trans = 0
for (j in bin) {
packet_count = packet_count + 1
data_trans = data_trans + trace[j,]$V6
}
packet_count_vec = c(packet_count_vec, packet_count)
data_trans_vec = c(data_trans_vec, data_trans)
}
par(mfrow=c(2, 1))
plot(packet_count_vec, type = "l", xlab = "Time (s)", ylab = "Packets")
title("Time Series of Total Packets")
plot(data_trans_vec, type = "l", xlab = "Time (s)", ylab = "Bits")
title("Time Series of Data Transferred")
我所做的是使用cut
为我的数据添加第二个时间间隔,然后为每个bin我计算bin中的数字(数据包数),并为每个数据包添加数据(总数是第二次发送的数据)。
可以找到跟踪here,重要的列是:
我目前的解决方案速度相当慢(我有1800秒),我想知道下次我如何更有效地做到这一点。
答案 0 :(得分:1)
假设我正确地浏览了文件,这就是我认为你想要实现的目标。我使用read_delim
中的readr
来快速读取文件,然后使用dplyr
惯用法来转换和汇总数据。我使用ggplot
与基础绘图和tidyr
在绘图之前再次转换数据。由于在ggplot
中使用了构面,因此简化了绘图。
library(dplyr)
library(readr)
library(stringr)
library(tidyr)
library(ggplot2)
library(scales)
trace <- read_delim("trace.txt", delim=" ", col_names=FALSE)
trace %>%
mutate(second=as.numeric(str_replace(X1, "\\..*$", ""))) %>% # only care about the second
group_by(second) %>% # group by the second
summarise(`Total Packets`=n(), # get packet count
`Data Transferred (Bits)`=sum(X6)) -> trace # get data count
head(trace)
## Source: local data frame [6 x 3]
##
## second Total Packets Data Transferred (Bits)
## 1 0 151 5497
## 2 1 203 11146
## 3 2 170 13986
## 4 3 163 10541
## 5 4 152 6781
## 6 5 147 9087
gg <- ggplot(gather(trace, Measure, value, -second))
gg <- gg + geom_line(aes(x=second, y=value, color=Measure))
gg <- gg + scale_y_continuous(label=comma)
gg <- gg + facet_wrap(~Measure, ncol=1, scales="free_y")
gg <- gg + labs(x="Time (s)", y=NULL)
gg <- gg + theme_bw()
gg <- gg + theme(legend.position="none")
gg