2

6台のバックアップサーバーの30分単位のビンにソートされたバックアップ期間のテキスト出力を作成しようとしています。入力データ(newdataと呼ばれる)の例は次のとおりです。

      backup_server   client      duration  
1     bkp01           server_A    60       
2     bkp01           server_A    34       
3     bkp01           server_A    230     
4     bkp02           server_A    14      
5     bkp02           server_C    29   
6     bkp02           server_C    62

今、私はすべてを一緒にビンに入れることができました:

br.br <-seq(0,max(newdata$duration),by=30)
cbind(table(cut(newdata$duration,br.br,right=FALSE)))

これは、この種の出力を提供します。

                    [,1]
[0,30)              3523
[30,60)             1394
[60,90)              230
[90,120)              35
[120,150)             10
[150,180)              0
[180,210)              3

私が見たいのは次のようなものです:

[,1]                bkp01      bkp02
[0,30)               523        422
[30,60)              394         30
[60,90)              130         10
[90,120)               5          3
[120,150)              1          2
[150,180)              0         10
[180,210)              2         20

私が得た最も近いものは、集計関数を使用することでしたが、実際には必要なことを実行しません。

> aggregate(newdata$Duration, by=list(newdata$TSM_server),FUN=mean)
  Group.1        x
1 bkp01       31.13307
2 bkp02       16.58491
4

2 に答える 2

1

私があなたを正しく理解しているなら、あなたはあなたのタイムビン内の各バックアップサーバーのカウントを探しています。(つまり、あなたが何をしようとしていたのかわかりませんでしたmean...)

その場合は、 reshape2パッケージdcastから使用する1つのオプションを次に示します。

dat <- read.table(text = "      backup_server   client      duration  
1     bkp01           server_A    60       
2     bkp01           server_A    34       
3     bkp01           server_A    230     
4     bkp02           server_A    14      
5     bkp02           server_C    29   
6     bkp02           server_C    62",sep = "",header = TRUE,row.names = 1)

#cut altered slightly to make more sense with your small example data
dat$dur <- cut(dat$duration,seq(0,max(dat$duration)+30,by = 30),right = FALSE)
dcast(dat,dur~backup_server,fun.aggregate = length,value.var = "dur")

        dur bkp01 bkp02
1    [0,30)     0     2
2   [30,60)     1     0
3   [60,90)     1     1
4 [210,240)     1     0
于 2012-12-13T19:24:11.597 に答える
1

これがあなたが望むものではない場合(そして@joranのソリューションを私のソリューションと比較すると、どの要約測定が必要かに関して解決すべきかなりのあいまいさがあることがわかります)....

 aggregate(newdata$Duration, 
           by=list(dur.cut=cut(newdata$duration,br.br,right=FALSE) , 
                   server=newdata$TSM_server),
            FUN=mean) 

次に、これを試してください:

 tapply( newdata$Duration, 
           INDEX=list(dur.cut=cut(newdata$duration,br.br,right=FALSE) , 
                   server=newdata$TSM_server),
            FUN=mean)

設定INDEX= interaction(var1, var2)によって若干異なる結果が得られることもあれば、より望ましい結果が得られることもあります。(これらのテストでは、列名があなたの例とは異なることに気付きました。)

 aggregate(newdata$duration, 
            by=list(dur.cut=cut(newdata$duration,br.br,right=FALSE) , 
                    server=newdata$backup_server),
             FUN=mean)
#------------
  dur.cut server    x
1 [30,60)  bkp01 34.0
2 [60,90)  bkp01 60.0
3  [0,30)  bkp02 21.5
4 [60,90)  bkp02 62.0

 tapply( newdata$duration, 
            INDEX=list(dur.cut=cut(newdata$duration,br.br,right=FALSE) , 
                    server=newdata$backup_server),
             FUN=mean)
#-------------
           server
dur.cut     bkp01 bkp02
  [0,30)       NA  21.5
  [30,60)      34    NA
  [60,90)      60  62.0
  [90,120)     NA    NA
  [120,150)    NA    NA
  [150,180)    NA    NA
  [180,210)    NA    NA
于 2012-12-13T19:15:25.087 に答える