2012-12-13 76 views
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 
+0

很抱歉的混亂。我只使用'mean'函數作爲我如何能夠顯示每個備份服務器的數據的示例。 @Doran是正確的,我正在尋找計數。 我能夠獲得@ doran的代碼工作,但我仍然很好奇如何獲得@Dinin的代碼。我會在下面回覆他的回答。 – pjackson

回答

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 
+0

當我運行tapply示例時,它沒有爲每列創建一個新的服務器,而是列出它們 'dur.cut server x [0,30] bkp01 NA [30,60] bkp01 34 [60 ,90)bkp01 60 [0,30] bkp02 21.5 [30,60] bkp02不適用 [60,90)bkp02 62.0 ' 發佈後,我不確定如何使其正確顯示,但本質上我有三列:dur.cut,服務器和平均值,而我想要dur.cut,bkp01,bkp02,然後計算數據字段中的每個值。 – pjackson

+0

當輸出結果是表格時,試圖在評論中進行交流是一種挫敗感。您已經勾選了答案,但如果答案不是您的想法,那麼您應該編輯您的問題,以澄清需要什麼總結度量以及您希望輸出的安排。 –

+0

我在我們的服務器版本上使用dcast時遇到了問題,在查看了@Dinin的解決方案後,我得到了所需的東西。 – pjackson

1

如果我正確認識你,你要找的計數的時間內箱每臺備份服務器。 (即我不知道什麼是與您嘗試使用mean ...)

如果是這樣的話,這是一個使用dcastreshape2包一個選項:

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 
+0

感謝您的評論!加載reshape2包後,我能夠得到我想要的輸出。 – pjackson