0

私は R を初めて使用します。私の問題は、R でそれを行う方法がわからないだけで、何をする必要があるかを知っていることです。Web サービスの負荷テストから非常に大きなデータ フレームがあり、最大 20M の観測があります。次の変数があります。

epochtime, uri, cache (hit or miss) 

私はいろいろなことをする必要があると思っています。上位 50 個の異なる URI のデータ フレームをサブセット化し、各サブセットの各観測値について、その時点でのキャッシュ ヒット率を計算する必要があります。最終目標は、URI ごとの経時的なキャッシュ ヒット/ミス % のプロットです。

私はこのトピックに関するさまざまな投稿を読み、まだ読んでいますが、R はかなり新しく、締め切りがあります。私が得ることができる助けをいただければ幸いです

編集:

正確なデータを提供することはできませんが、Mongo データベースから取得した少なくとも 2,000 万件の観測結果は次のようになります。時間はエポックであり、毎秒数千を記録しているため、時間には多くの重複があります。50 を超える uri が存在する可能性があります。上位 50 のみを気にします。最終結果は、UR​​I ごとの合計発生数に対する % TCP_HIT の経時的な折れ線グラフになります。それがより明確であることを願っています

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と呼びます。

> 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を使用)は次のとおりです。

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のコードは正しい考えです。具体的には、split-apply-combine戦略を利用するものが必要です。

ただし、データのサイズを考えると、data.tableパッケージを見てみます。

ここで視覚的に理由がわかります--data.tableがちょうど速いです。

于 2012-12-16T20:39:40.337 に答える
0

それらの問題のプロット部分に対する私の解決策を共有すると便利だと思いました。

私のRの「初心者」はここで私の輝きですが、これは私が思いついたものです. 基本的なライン プロットを作成します。実際の値をプロットしていますが、変換は行っていません。

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 に答える