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

如果这不是您想要的(并且通过将@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 回答
1

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

如果是这种情况,这里有一个使用reshape2dcast的选项:

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 回答