2012-12-13 41 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