gpt4 book ai didi

r - 按列表订购

转载 作者:行者123 更新时间:2023-12-04 11:58:43 24 4
gpt4 key购买 nike

我遇到了一个应用程序,我需要按列号对 data.frame 进行排序,而 usual solutions 都没有。似乎允许。

上下文正在创建 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 排序)。

最佳答案

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] ) , ]

关于r - 按列表订购,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7721949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com