按功能按日期排序数据框列

时间:2015-02-10 23:00:22

标签: r dataframe

我有以下数据框,

ESIVmatrix <- structure(c(1000, 1050, 1100, 1150, 1200, 1250, 0.596044633067339, 
0.568874415146119, 0.548817842630467, 0.528509198265979, 0.505102479305053, 
0.481863859161313, 0.419829588814411, 0.407383853187116, 0.395662104352744, 
0.383710399971056, 0.371402827197033, 0.358943850461579, 0.390669388091009, 
0.380556007177402, 0.369862565005378, 0.358004628064117, 0.347655431619544, 
0.33661166544938, 0.474661141683071, 0.457000912081753, 0.444006689151462, 
0.429723103151982, 0.415839741238857, 0.400624512403368), .Dim = c(6L, 
5L), .Dimnames = list(NULL, c("Strikes", "20150417", "20150918", 
"20151218", "20150619")))

但是,列的顺序不是按日期顺序排列的。我希望它们符合日期顺序(20150417,20150619,20150918,20151218)。

我尝试使用order()arrange()无济于事。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

尝试仅对列进行排序(即[的第二个参数):

ESIVmatrix[, order(colnames(ESIVmatrix))]

这样可行,但最后留下strikes列。您可以使用稍微复杂的订单进行解决方法:

ESIVmatrix[, c(1, order(colnames(ESIVmatrix)[-1]) + 1)]

产地:

     Strikes  20150417  20150619  20150918  20151218
[1,]    1000 0.5960446 0.4746611 0.4198296 0.3906694
[2,]    1050 0.5688744 0.4570009 0.4073839 0.3805560
[3,]    1100 0.5488178 0.4440067 0.3956621 0.3698626
[4,]    1150 0.5285092 0.4297231 0.3837104 0.3580046
[5,]    1200 0.5051025 0.4158397 0.3714028 0.3476554
[6,]    1250 0.4818639 0.4006245 0.3589439 0.3366117

我们在这里采取一些技巧,因为我们需要第一列留在第一位。考虑:

c(1, order(colnames(ESIVmatrix)[-1]) + 1)

我们在这里说:

  • 向我们提供第一栏:c(1, ...
  • 然后按列名称排除第一列以外的所有列:order(colnames(ESIVmatrix)[-1])
  • 然后我们需要将+ 1添加到最后一个部分,因为order只返回相对于正在排序的内容的indeces,在这种情况下缺少第一列,所以我们必须抵消所有内容回来一个