按日期和字符串值排序数据框

时间:2015-01-27 12:18:25

标签: r sorting dataframe

我从Bloomberg下载数据,然后在R中更新。数据框如下所示。

 ticker       date PX_LAST PE_RATIO
1 SMI Index 2014-09-30 8835.14  20.3692
2 SMI Index 2014-10-31 8837.78  20.3753
3 DAX Index 2014-09-30 9474.30  16.6487
4 DAX Index 2014-10-31 9326.87  16.3896
5 SMI Index 2014-11-28 9150.46  21.0962
6 SMI Index 2014-12-31 8983.37  20.6990
7 DAX Index 2014-11-28 9980.85  17.5388
8 DAX Index 2014-12-31 9805.55  16.8639

现在我希望这个数据框按照自动收报机排序(不按字母顺序,但按照自动收报机的顺序排序),然后是日期,以便最终结果如下:

 ticker       date PX_LAST PE_RATIO
1 SMI Index 2014-09-30 8835.14  20.3692
2 SMI Index 2014-10-31 8837.78  20.3753
3 SMI Index 2014-11-28 9150.46  21.0962
4 SMI Index 2014-12-31 8983.37  20.6990
5 DAX Index 2014-09-30 9474.30  16.6487
6 DAX Index 2014-10-31 9326.87  16.3896
7 DAX Index 2014-11-28 9980.85  17.5388
8 DAX Index 2014-12-31 9805.55  16.8639

2 个答案:

答案 0 :(得分:3)

chgroup()包中有一个函数data.table,可以完全满足您的要求。它将来自向量的值组合在一起,同时保留初始顺序。它仅适用于角色向量(角色为ch)。

require(data.table)
DF[chgroup(DF$ticker), ]
#     ticker       date PX_LAST PE_RATIO
# 1 SMIIndex 2014-09-30 8835.14  20.3692
# 2 SMIIndex 2014-10-31 8837.78  20.3753
# 5 SMIIndex 2014-11-28 9150.46  21.0962
# 6 SMIIndex 2014-12-31 8983.37  20.6990
# 3 DAXIndex 2014-09-30 9474.30  16.6487
# 4 DAXIndex 2014-10-31 9326.87  16.3896
# 7 DAXIndex 2014-11-28 9980.85  17.5388
# 8 DAXIndex 2014-12-31 9805.55  16.8639

如果您的ticker列为factor,请先将其转换为character类型。

答案 1 :(得分:2)

您可以尝试order

 df$ticker <- factor(df$ticker, levels=unique(df$ticker))
 df1 <- df[with(df, order(ticker, date)),]
 row.names(df1) <- NULL
 df1
 #     ticker       date PX_LAST PE_RATIO
 #1 SMI Index 2014-09-30 8835.14  20.3692
 #2 SMI Index 2014-10-31 8837.78  20.3753
 #3 SMI Index 2014-11-28 9150.46  21.0962
 #4 SMI Index 2014-12-31 8983.37  20.6990
 #5 DAX Index 2014-09-30 9474.30  16.6487
 #6 DAX Index 2014-10-31 9326.87  16.3896
 #7 DAX Index 2014-11-28 9980.85  17.5388
 #8 DAX Index 2014-12-31 9805.55  16.8639