我正在尝试为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 :(得分: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