【问题标题】:R sorts a vector on its own accordR 自行对向量进行排序
【发布时间】:2011-05-16 05:42:13
【问题描述】:
df.sorted <- c("binned_walker1_1.grd", "binned_walker1_2.grd", "binned_walker1_3.grd",
    "binned_walker1_4.grd", "binned_walker1_5.grd", "binned_walker1_6.grd",
    "binned_walker2_1.grd", "binned_walker2_2.grd", "binned_walker3_1.grd",
    "binned_walker3_2.grd", "binned_walker3_3.grd", "binned_walker3_4.grd",
    "binned_walker3_5.grd", "binned_walker4_1.grd", "binned_walker4_2.grd",
    "binned_walker4_3.grd", "binned_walker4_4.grd", "binned_walker4_5.grd",
    "binned_walker5_1.grd", "binned_walker5_2.grd", "binned_walker5_3.grd",
    "binned_walker5_4.grd", "binned_walker5_5.grd", "binned_walker5_6.grd",
    "binned_walker6_1.grd", "binned_walker7_1.grd", "binned_walker7_2.grd",
    "binned_walker7_3.grd", "binned_walker7_4.grd", "binned_walker7_5.grd",
    "binned_walker8_1.grd", "binned_walker8_2.grd", "binned_walker9_1.grd",
    "binned_walker9_2.grd", "binned_walker9_3.grd", "binned_walker9_4.grd",
    "binned_walker10_1.grd", "binned_walker10_2.grd", "binned_walker10_3.grd")

人们会认为这个向量的顺序是1:length(df.sorted),但情况似乎并非如此。看起来 R 在内部根据其逻辑对向量进行了排序,但非常努力地以创建方式显示它(并在输出中看到)。

order(df.sorted)
 [1] 37 38 39  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22
[26] 23 24 25 26 27 28 29 30 31 32 33 34 35 36

有没有办法将排序“重置”为1:length(df.sorted)?这样一来,向量的排序和输出就会同步。

【问题讨论】:

    标签: r sorting vector


    【解决方案1】:

    这难道不是与所有字典短裤(例如目录上的ls)相同,其中walker10_foo sorts 高于walker1_foo

    在我的书中,最简单的方法是使用一致的位数,即我将更改为 binned_walker01_1.grd 等等,为一位数插入 0。

    【讨论】:

    • 有时数据“来自你”,而不是从一开始就“放在你手中”。这就是为什么我永远不会忽视 Greg Warnes mixedsort() 的价值。
    【解决方案2】:

    将其构造为有序因子:

    > df.new <- ordered(df.sorted,levels=df.sorted)
    > order(df.new)
     [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 ...
    

    编辑:

    在@DWins 评论之后,我想补充一点,将其设为有序因子甚至没有必要,如果你给出正确的级别顺序,一个因子就足够了:

    >     df.new2 <- factor(df.sorted,levels=df.sorted)
    >     order(df.new)
     [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 ...
    

    当您在回归分析中使用这些因素时,差异会很明显,它们可以被区别对待。有序因子的优点是它们允许您将比较运算符用作 。这有时会让生活变得轻松许多。

    > df.new2[5] < df.new2[10]
    [1] NA
    Warning message:
    In Ops.factor(df.new[5], df.new[10]) : < not meaningful for factors
    
    > df.new[5] < df.new[10]
    [1] TRUE
    

    【讨论】:

      【解决方案3】:

      使用 gtools 包中的 mixedsort(或)mixedorder 函数:

      require(gtools)
      mixedorder(df.sorted)
       [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
      [28] 28 29 30 31 32 33 34 35 36 37 38 39
      

      【讨论】:

      • 其实我的df.sorted是gtools::mixedsort的结果。 :)
      • @Roman:确实如此,但问题是订单仍会按照正常排序为您提供订单。 mixedsort 是 sort 的混合等价物,mixedorder 是 order 的混合等价物。 Mixedsort 不会将顺序保存在对象中,因为您必须将其设为有序因子。
      • @Joris:不需要将其设为有序因子,我建议人们不要这样做,因为它会真正改变回归函数处理因子的方式,而这可能会一开始会莫名其妙。只需在常规因子结构中重新排序级别即可。
      • @Dwin :是的,我会更新我的答案。请记住,虽然正常因素不允许您使用 运算符测试订单。
      • 感谢您添加关于在有序因子上使用比较运算符的潜力。可能很方便。
      【解决方案4】:

      为了回应 Dwin 对 Dirk 的回答的评论:数据总是在你手中。 “这是R。没有如果。只有如何。” ——西蒙·布隆伯格

      您可以像这样添加0

      df.sorted <- gsub("(walker)([[:digit:]]{1}_)", "\\10\\2", df.sorted)
      

      如果你需要添加00,你可以这样做:

      df.sorted <- gsub("(walker)([[:digit:]]{1}_)", "\\10\\2", df.sorted)
      df.sorted <- gsub("(walker)([[:digit:]]{2}_)", "\\10\\2", df.sorted)
      

      ...等等。

      【讨论】:

      • 是的,一切都与方法有关。我只是一个徒弟。也许有一天我可以制作自己的光剑。在那之前我会使用其他人的。
      • @DWin 但是如果你只使用别人的,你将如何学会自己制作呢? ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 2012-02-19
      相关资源
      最近更新 更多