我有一个庞大的债券数据数据框,如:
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
我从这个问题尝试了类似的东西:
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
但它没有做我想做的事。
我不想要
感谢您的帮助!
答案 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)