0

我是 R 新手,我的问题是我知道我需要做什么,只是不知道如何在 R 中完成。我有一个来自 Web 服务负载测试的非常大的数据框,大约 20M 观察。我有以下变量:

epochtime, uri, cache (hit or miss) 

我想我需要做一些事情。我需要对前 50 个不同 URI 的数据帧进行子集化,然后为每个子集中的每个观察值计算该时间点的缓存命中百分比。最终目标是按 URI 随时间变化的缓存命中/未命中百分比图

我已经阅读,并且仍在阅读关于这个主题的各种帖子,但 R 是相当新的,我有一个截止日期。我会很感激我能得到的任何帮助

编辑:

我无法提供准确的数据,但它看起来像这样,我从 Mongo 数据库中检索到的至少 20M 观察结果。时间是一个时代,我们每秒记录数千个,所以时间有很多骗局,这是意料之中的。可能有超过 50 个 uri,我只关心前 50 个。最终结果将是 % TCP_HIT 与 URI 的总出现时间的线图。希望那更清楚

time                uri                 action
1355683900          /some/uri           TCP_HIT
1355683900          /some/other/uri     TCP_HIT 
1355683905          /some/other/uri     TCP_MISS
1355683906          /some/uri           TCP_MISS
4

3 回答 3

4

您正在寻找该aggregate功能。

调用你的数据框你:

> u
        time             uri   action
1 1355683900       /some/uri  TCP_HIT
2 1355683900 /some/other/uri  TCP_HIT
3 1355683905 /some/other/uri TCP_MISS
4 1355683906       /some/uri TCP_MISS

这是子集的命中率(使用因子级别的顺序,默认情况下使用 TCP_HIT=1,TCP_MISS=2 作为字母顺序),间隔为 10 秒:

ratio <- function(u) aggregate(u$action ~ u$time %/% 10,
         FUN=function(x) sum((2-as.numeric(x))/length(x)))

现在使用 lapply 得到最终结果:

lapply(seq_along(levels(u$uri)),
    function(l) list(uri=levels(u$uri)[l],
     hits=ratio(u[as.numeric(u$uri) == l,])))


[[1]]
[[1]]$uri
[1] "/some/other/uri"

[[1]]$hits
  u$time%/%10 u$action
1   135568390      0.5


[[2]]
[[2]]$uri
[1] "/some/uri"

[[2]]$hits
  u$time%/%10 u$action
1   135568390      0.5

或者在计算比率之前按 URI 过滤数据帧。

于 2012-12-16T19:48:13.410 回答
2

@MatthewLundberg 的代码是正确的想法。具体来说,您需要使用拆分-应用-组合策略的东西。

不过,鉴于您的数据的大小,我会看看这个data.table包。

您可以在这里直观地看到为什么--data.table 更快。

于 2012-12-16T20:39:40.337 回答
0

认为分享我对他们问题的绘图部分的解决方案会很有用。

我的 R “noobness”在这里大放异彩,但这就是我想出的。它制作了一个基本的线图。它绘制了实际值,我没有进行任何转换。

for ( i in 1:length(h)) {
  name <- unlist(h[[i]][1])  
  dftemp <- as.data.frame(do.call(rbind,h[[i]][2]))
  names(dftemp) <-  c("time", "cache")
  plot(dftemp$time,dftemp$cache, type="o")
  title(main=name)
}
于 2012-12-17T23:04:56.587 回答