【问题标题】:R: Re-order numeric vector by name using custom orderR:使用自定义顺序按名称重新排序数字向量
【发布时间】:2016-12-28 03:54:09
【问题描述】:

我有一个数字向量,并希望使用自定义顺序按名称重新排序。

x <- sample(1:20, 5)
names(x) <- c("feb", "may", "mar", "jan", "apr")
x
feb may mar jan apr 
  7  10   5  13  11 

如您所见,向量不是按月顺序排列的

期望的输出

我希望使用名称按月顺序重新排序此字符向量,即jan, feb, mar, apr, may...

这怎么可能?

注意:我追求的是一种可用于所有名称/字符串的方法,而不是专门用于日期对象的方法

【问题讨论】:

    标签: r vector numeric


    【解决方案1】:

    我们可以将“x”的names 转换为factor,并将levels 设置为小写的month.abb,应用order 并按该顺序获取“x”。

    x[order(factor(names(x), levels=tolower(month.abb)))]
    jan feb mar apr may 
     13  7   5  11  10 
    

    指定levelsfactor 的转换可以按自定义顺序应用于任何字符向量,否则,默认情况下,排序基于字母顺序,即

    x[order(names(x))]
    

    假设,如果希望订单为“jan”、“mar”、“apr”、“may”、“feb”,则在factor 调用中将其用作levels

    x[order(factor(names(x), levels = c('jan', 'mar', 'apr', 'may', 'feb')))]
    

    由于 OP 在 cmets 中以自定义顺序发布了另一个向量

    x1 <- c(icecream = 3, jelly = 4, fruit = 5)
    x1[order(factor(names(x1), levels = c("jelly", "fruit", "icecream")))]
    #   jelly    fruit icecream 
    #      4        5        3 
    

    【讨论】:

    • 您好,我正在寻找一种可用于所有字符类/名称的通用方法,而不是仅限于月份/日期对象的方法
    • @G.Gip 字符元素按字母排序,所以如果这是您想要的,x[order(names(x))],但您的示例似乎基于月份名称的自定义顺序。如果是自定义订单,那么factorlevels的方式是通用的。
    • 没有。不是按字母排序,而是自定义顺序。例如,如果您有一个向量 icecream = 3, jelly = 4, fruit = 5 并希望它被订购 jelly = 4, fruit = 5, icecream = 3
    • @我知道这是题外话,但为了避免为一件小事打开一个新问题。如果我想使用基于这些名称的图例为条形图着色,例如我想要冬季月份的蓝色条形图和夏季月份的红色条形图,具有以下类别winter = dec:feb, summer = mar:may 或使用另一个示例,糖果的黄色条形图 (jelly, icecream) 和水果的绿色条形图 (fruit)。这可能吗?
    • @G.Gip 你可以做x2 &lt;- x1[order(factor(names(x1), levels = c("jelly", "fruit", "icecream")))]; barplot(x2, col = c("yellow", "green", "yellow"))
    猜你喜欢
    • 1970-01-01
    • 2014-12-20
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2023-02-02
    • 2019-08-20
    相关资源
    最近更新 更多