Я столкнулся с приложением, в котором мне нужно отсортировать data.frame по номерам столбцов, и ни одно из обычных решений , похоже, не позволяет этого.
Контекст создаетas.data.frame.by
метод.Поскольку объект by
будет иметь свой последний столбец в качестве столбца значения и первые столбцы ncol-1 в качестве столбцов индекса.melt
возвращает сортировку в обратном направлении - индекс 3, затем индекс 2, затем индекс 1. Для совместимости с latex.table.by
я бы хотел отсортировать его вперед.Но у меня возникли проблемы с тем, чтобы сделать это достаточно общим способом.Закомментированная строка в функции ниже - моя лучшая попытка на данный момент.
as.data.frame.by <- function( x, colnames=paste("IDX",seq(length(dim(x))),sep="" ), ... ) {
num.by.vars <- length(dim(x))
res <- melt(unclass(x))
res <- na.omit(res)
colnames(res)[seq(num.by.vars)] <- colnames
#res <- res[ order(res[ , seq(num.by.vars)] ) , ] # Sort the results by the by vars in the heirarchy given
res
}
dat <- transform( ChickWeight, Time=cut(Time,3), Chick=cut(as.numeric(Chick),3) )
my.by <- by( dat, with(dat,list(Time,Chick,Diet)), function(x) sum(x$weight) )
> as.data.frame(my.by)
IDX1 IDX2 IDX3 value
1 (-0.021,6.99] (0.951,17.3] 1 3475
2 (6.99,14] (0.951,17.3] 1 5969
3 (14,21] (0.951,17.3] 1 8002
4 (-0.021,6.99] (17.3,33.7] 1 640
5 (6.99,14] (17.3,33.7] 1 1596
6 (14,21] (17.3,33.7] 1 2900
13 (-0.021,6.99] (17.3,33.7] 2 2253
14 (6.99,14] (17.3,33.7] 2 4734
15 (14,21] (17.3,33.7] 2 7727
22 (-0.021,6.99] (17.3,33.7] 3 666
23 (6.99,14] (17.3,33.7] 3 1391
24 (14,21] (17.3,33.7] 3 2109
25 (-0.021,6.99] (33.7,50] 3 1647
26 (6.99,14] (33.7,50] 3 3853
27 (14,21] (33.7,50] 3 7488
34 (-0.021,6.99] (33.7,50] 4 2412
35 (6.99,14] (33.7,50] 4 5448
36 (14,21] (33.7,50] 4 8101
Если строка не закомментирована, она возвращает бессмысленно (она просто обрабатывает весь data.frame как вектор, что приводит к катастрофическим результатам).
Я даже пробовал такие умные вещи, как res <- res[ order( ...=list(res[,1],res[,2]) ) , ]
, но безрезультатно.
Я подозреваю, что есть простой способ сделать это, но я его не вижу.
Редактировать для уточнения : Я не хочу указывать имена столбцов.Вместо этого я хочу иметь возможность сортировать его по числовому вектору (например, сортировать по столбцам 1: 4).