R 在名单上排序

R 在名单上排序,r,R,我遇到过一个应用程序,其中我需要按列数对data.frame进行排序,但似乎并没有一个允许这样做 上下文正在创建一个as.data.frame.by方法。因为by对象将其最后一列作为值列,第一列ncol-1列作为索引列melt返回向后排序的结果——索引3,然后是索引2,然后是索引1。为了与latex.table.by兼容,我想将其向前排序。但我很难用一种足够通用的方式来做这件事。下面函数中注释掉的行是我迄今为止最好的尝试 as.data.frame.by <- function( x, c

我遇到过一个应用程序,其中我需要按列数对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

as.data.frame.by
mydf抱歉应该更清楚:我不想指定列名。相反,我希望能够通过数字向量对其进行排序(例如,按列1:4排序)。参见上文。将数据帧传递给
order
的do.call方法如
help(order)
page.Nice所示。谢谢我需要更仔细地研究
do.call
,因为我怀疑它会解决我的许多问题:-)是的。我花了几年时间才明白,
do.call
也是我许多问题的答案
do.call
对函数的作用与
get
paste
对数据对象的作用相同,可以将字符表示转换为语言对象,并允许多个值构造一个计算表达式。因此,我可以认为
do.call
在需要向
传递内容时非常有用?
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
my.by <- by( dat, with(dat,list(Diet,Chick, Time)), function(x) sum(x$weight) )
mydf <- as.data.frame(my.by)
 mydf <- as.data.frame(my.by)
 mydf[ do.call(order, mydf[, 3:1] ) , ]