跨多个类别进行分区

时间:2012-12-13 18:53:43

标签: r

我正在尝试为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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果我正确理解您,您正在寻找时间箱内每个备份服务器的计数。 (即我不确定您尝试使用mean ...)

如果是这种情况,可以使用 reshape2 包中的dcast选项:

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