对子组内的R数据帧中的数据进行排序

时间:2016-04-01 12:36:03

标签: r sorting dataframe

我有一个庞大的债券数据数据框,如:

while (Nameplate >= 'a' && Nameplate <= 'z' &&  Nameplate == '.')

我想通过ISIN代码对元素进行分组,然后按递增顺序对组内的日期进行排序(已在上面的示例中完成),然后我想对组进行排序(A,B,C,D,E) ,在这个例子中为F),使得具有最早日期的组首先出现,然后是具有第二个最早日期的组,依此类推。

我希望它看起来像这样:

   ISIN      CF       DATE
1   A   105.750  2016-09-30
2   B   104.875  2016-05-31
3   C   106.875  2017-02-13
4   D   103.875  2016-10-07
5   E   5.000    2016-04-21
6   E   5.000    2017-04-21
7   E   5.000    2018-04-21
8   E   5.000    2019-04-21
9   E   105.000  2020-04-21
10  F   7.800    2016-09-09
11  F   7.800    2017-09-09
12  F   7.800    2018-09-09
13  F   7.800    2019-09-09
14  F   107.800  2020-09-09

我从这个问题尝试了类似的东西:

  

How to sort a dataframe by column(s)?

  ISIN     CF      DATE
16  E   5.000   2016-04-21
15  E   5.000   2017-04-21
14  E   5.000   2018-04-21
13  E   5.000   2019-04-21
12  E   105.000 2020-04-21
 7  B   104.875 2016-05-31
10  F    7.800  2016-09-09
11  F    7.800  2017-09-09
12  F    7.800  2018-09-09
13  F    7.800  2019-09-09
14  F   107.800 2020-09-09
6   A   105.750 2016-09-30
23  D   103.875 2016-10-07
22  C   106.875 2017-02-13

但它没有做我想做的事。

我不想要

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

使用data.table

DT <- data.table(yourDF, key = c("ISIN", "Date"))

答案 1 :(得分:1)

NEW UPDATE

现在使用ISIN和更多关系好多了,我使用了两个辅助列。 首先,我通过DATE生成订单,然后按ISIN分组并获取每个组的最小值(这给出了组顺序)。 我的data.frame名为B.

ord<-B %>% arrange(DATE) %>% mutate(ord=order(DATE))
ord2<-ord %>% group_by(ISIN) %>% summarize(min_ord=min(ord))
ord3<-merge(ord,ord2)
ord3<-ord3 %>% arrange(min_ord)

ISIN      CF       DATE ord min_ord
1     E   5.000 2016-04-21   1       1
2     E   5.000 2017-04-21   7       1
3     E   5.000 2018-04-21   9       1
4     E   5.000 2019-04-21  11       1
5     E 105.000 2020-04-21  13       1
6     B 104.875 2016-05-31   2       2
7     F   7.800 2017-09-09   8       3
8     F   7.800 2018-09-09  10       3
9     F   7.800 2019-09-09  12       3
10    F 107.800 2020-09-09  14       3
11    F   7.800 2016-09-09   3       3
12    A 105.750 2016-09-30   4       4
13    D 103.875 2016-10-07   5       5
14    C 106.875 2017-02-13   6       6

您可以使用管道中的select(ISIN:DATE)删除多余的列。我保留它们是因为我认为它们可以方便进行额外的计算。

OLD UPDATE

好的,问题是您的ISIN值不适用于您想要的订单。 有时,你的ISIN进入&#34;降序&#34;订单(例如,503326&gt; 255820&gt; 255817),但有时它不会,您希望您的DATE列订购您的data.frame(例如,2016-05-31之前2016-09-30 2016-10-07之前)在2017-02-13之前。)

因为在这种情况下,ISIN允许以伪方便的方式使用ifelse:

df %>% mutate(ord=ifelse(ISIN=="XS0503326083",1,
                  ifelse(ISIN=="XS0255820804",2,
                  ifelse(ISIN=="XS0255817685",3,
                  ifelse(ISIN=="XS0438753294",4,5))))) %>%
       arrange(ord)

  row.names         ISIN      CF       DATE ord
1        16 XS0503326083   5.000 2016-04-21   1
2        15 XS0503326083   5.000 2017-04-21   1
3        14 XS0503326083   5.000 2018-04-21   1
4        13 XS0503326083   5.000 2019-04-21   1
5        12 XS0503326083 105.000 2020-04-21   1
6         7 XS0255820804 104.875 2016-05-31   2
7         6 XS0255817685 105.750 2016-09-30   3
8        23 XS0438753294 103.875 2016-10-07   4
9        22 XS0286431100 106.875 2017-02-13   5

我知道您可能有很多ISIN值可以合并到这种情况中。此外,在您的示例中,唯一绑定的ISIN值将由DATE和CF排列,没有任何问题。这可能不适用于您更大的数据框架。

答案 2 :(得分:1)

library(dplyr)
sorted <- df %>% arrange(ISIN,DATE)