gpt4 book ai didi

r - 在 R 数据框中对子组进行排序

转载 作者:行者123 更新时间:2023-12-01 11:27:05 27 4
gpt4 key购买 nike

我有一个很大的债券数据data.frame,像这样:

   ISIN      CF       DATE
A 105.750 2016-09-30
B 104.875 2016-05-31
C 106.875 2017-02-13
D 103.875 2016-10-07
E 5.000 2016-04-21
E 5.000 2017-04-21
E 5.000 2018-04-21
E 5.000 2019-04-21
E 105.000 2020-04-21
F 7.800 2016-09-09
F 7.800 2017-09-09
F 7.800 2018-09-09
F 7.800 2019-09-09
F 107.800 2020-09-09

我想按 ISIN 代码对元素进行分组,然后在这些组中按 DATE 以升序对 CF 元素进行排序(已经在上面的例子中完成)。然后我想对组进行排序 (A, B, C, D, E, F 在这个例子中)使得最早日期的组排在第一位,然后是第二早日期的组,依此类推。

我希望它看起来像这样:

  ISIN     CF      DATE
E 5.000 2016-04-21
E 5.000 2017-04-21
E 5.000 2018-04-21
E 5.000 2019-04-21
E 105.000 2020-04-21
B 104.875 2016-05-31
F 7.800 2016-09-09
F 7.800 2017-09-09
F 7.800 2018-09-09
F 7.800 2019-09-09
F 107.800 2020-09-09
A 105.750 2016-09-30
D 103.875 2016-10-07
C 106.875 2017-02-13

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

How to sort a dataframe by column(s)?

df<-df[order(df$ISIN,df$DATE),]

但它并没有按照我的意愿行事。

最佳答案

这就完成了工作——基本上,首先根据最小日期创建每个 ISIN 的排名,然后根据该排名排序:

library(data.table)
setDT(DF)

DF[DF[ , min(DATE), by = ISIN
][ , .(ISIN, rank = frank(V1))
], on = "ISIN"
][order(rank, DATE)]
# ISIN CF DATE rank
# 1: E 5.000 2016-04-21 1
# 2: E 5.000 2017-04-21 1
# 3: E 5.000 2018-04-21 1
# 4: E 5.000 2019-04-21 1
# 5: E 105.000 2020-04-21 1
# 6: B 104.875 2016-05-31 2
# 7: F 7.800 2016-09-09 3
# 8: F 7.800 2017-09-09 3
# 9: F 7.800 2018-09-09 3
# 10: F 7.800 2019-09-09 3
# 11: F 107.800 2020-09-09 3
# 12: A 105.750 2016-09-30 4
# 13: D 103.875 2016-10-07 5
# 14: C 106.875 2017-02-13 6

如果您想避免创建副本,请改为这样做:

DF[DF[ , min(DATE), by = ISIN
][ , .(ISIN, rank = frank(V1))
], rank := rank, on = "ISIN"]

setorder(DF, rank, DATE)

如果您不想创建 rank 列,请改用 factor levels:

ord <- DF[ , min(DATE), by = ISIN][ , ISIN[frank(V1)]]

DF[ , ISIN := factor(ISIN, levels = ord)]
DF[order(ISIN, DATE)]
# ISIN CF DATE
# 1: E 5.000 2016-04-21
# 2: E 5.000 2017-04-21
# 3: E 5.000 2018-04-21
# 4: E 5.000 2019-04-21
# 5: E 105.000 2020-04-21
# 6: B 104.875 2016-05-31
# 7: F 7.800 2016-09-09
# 8: F 7.800 2017-09-09
# 9: F 7.800 2018-09-09
# 10: F 7.800 2019-09-09
# 11: F 107.800 2020-09-09
# 12: A 105.750 2016-09-30
# 13: D 103.875 2016-10-07
# 14: C 106.875 2017-02-13

你也可以像这样在 base 中这样做,但它会更慢:

ord <- names(sort(by(DF, DF$ISIN, function(x) min(x$DATE))))

DF$ISIN <- factor(DF$ISIN, levels = ord)

DF[with(DF, order(ISIN, DATE)),]

关于r - 在 R 数据框中对子组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36375438/

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