【问题标题】:R - Sorting by date periods (like 5y, 10d )R - 按日期周期排序(如 5y, 10d )
【发布时间】:2015-12-02 03:05:07
【问题描述】:

有没有办法按日期对数据进行排序。例如

myCurve <- data.table( Term=c('10y', '3y', '5y'), value = c(2, 1.25, 1.9))

我想把数据按 Term 排序,这样结果就是这样

Term  Value
3y    1.25
5y    1.90
10y   2.00

术语可以是 d,w,m,y 等。

【问题讨论】:

    标签: r sorting date period


    【解决方案1】:

    我注意到,在仅使用“年”创建的 OP 帖子中的简单示例中,可能存在“日”、“周”和“月”(由“d”、“w”表示, 'm' 作为后缀)也将出现在原始数据中。我们可以将字符串转换为天数。我们将“术语”中的数字与非数字字符分开,将“非数字”转换为factor,以天数指定levels,以便将“y”转换为365,将“m”转换为“ 30', 'w' 到 '7' 和 'd' 为 1 类似地,数字部分使用as.numeric、乘法和order 进行转换。

     myCurve1[order(as.numeric(sub('\\D+', '', Term))*
         as.numeric(as.character(factor(sub('\\d+', '', Term),
         levels=c('d', 'w', 'm', 'y'), labels=c(1, 7, 30, 365)))))]
    #   Term Value
    #1:   5d  2.00
    #2:  12d  2.40
    #3:   2w  2.10
    #4:   2m  4.30
    #5:  12w  4.20
    #6:   7m  7.50
    #7:   3y  1.90
    #8:   5y  2.50
    #9:  10y  1.25
    

    数据

    myCurve1 <- data.table(Term=c('10y', '3y', '5d', '2w', '12d', '12w', '7m', 
         '5y', '2m'), Value=c(1.25, 1.9, 2, 2.1, 2.4, 4.2, 7.5, 2.5, 4.3))
    

    【讨论】:

    • 谢谢@akrun。 “因素”方法接近但不完整。例如 12w 应该在 2m 之后。但在建议的解决方案中,12w 出现在 2m 之前,因此不完整。
    • @BalajiSubramanian 你能试试更新的代码吗?在这里,我将 'm' 设为 30 天,将 'y' 设为 365