mydf <- as.data.frame(my.by) mydf[order(mydf$IDX3, mydf$IDX2, mydf$IDX1) , ] IDX1 IDX2 IDX3 value 1 (-0.021,6.99] (0.951,17.3] 1 3475 3 (14,21] (0.951,17.3] 1 8002 2 (6.99,14] (0.951,17.3] 1 5969 4 (-0.021,6.99] (17.3,33.7] 1 640 6 (14,21] (17.3,33.7] 1 2900 5 (6.99,14] (17.3,33.7] 1 1596 13 (-0.021,6.99] (17.3,33.7] 2 2253 15 (14,21] (17.3,33.7] 2 7727 14 (6.99,14] (17.3,33.7] 2 4734 22 (-0.021,6.99] (17.3,33.7] 3 666 24 (14,21] (17.3,33.7] 3 2109 23 (6.99,14] (17.3,33.7] 3 1391 25 (-0.021,6.99] (33.7,50] 3 1647 27 (14,21] (33.7,50] 3 7488 26 (6.99,14] (33.7,50] 3 3853 34 (-0.021,6.99] (33.7,50] 4 2412 36 (14,21] (33.7,50] 4 8101 35 (6.99,14] (33.7,50] 4 5448
Or;
my.by <- by( dat, with(dat,list(Diet,Chick, Time)), function(x) sum(x$weight) ) mydf <- as.data.frame(my.by)
EDIT: Or this produces the same output as the top using column numeric indices:
mydf <- as.data.frame(my.by) mydf[ do.call(order, mydf[, 3:1] ) , ]