【问题标题】:Function reorder in R and ordering values [duplicate]R中的函数重新排序和排序值[重复]
【发布时间】:2013-12-02 14:18:33
【问题描述】:

我正在尝试以下功能:

stest <- data.frame(group=c("John", "Jane", "James"), mean=c(3, 5, 1))
transform(stest, group = reorder(group, mean))

并期望输出按mean 排序。相反,我得到:

  group mean
1  John    3
2  Jane    5
3 James    1

也就是说,与原始数据框中的顺序相同。

我错过了什么吗?如何通过其中一个数值变量对数据框进行正确排序?

周围的建议是关于使用reorder,但我无法使其按预期工作。任何加载的包都会干扰吗?

【问题讨论】:

  • 也许我没有得到你想要的,但是: stest[order(stest$mean),] 就足够了?
  • @Chargaff 是的,它返回了正确的顺序,但是当我尝试在 ggplot 中使用这个数据框时,ggplot 仍然按照之前的顺序绘制它。
  • @BlueMagister 来自 OP 的最后一条评论,看起来它实际上可能是 stackoverflow.com/q/5208679/1317221 的骗子
  • @user1317221_G 同意。但是,我不能改变我对该问题的接近投票 - 只能完全撤回接近投票。至少,标题含糊不清,足以指向这两个问题。

标签: r sorting


【解决方案1】:

来自documentation

reorder 是一个通用函数。 “默认”方法将其第一个参数视为分类变量,并根据第二个变量(通常是数字)的值重新排序其级别。

注意:重新排序级别,而不是因子变量的值(在您的情况下为group)。

比较:

levels(stest$group)
[1] "James" "Jane"  "John" 

>  reorder(stest$group, c(1,2,3))
[1] John  Jane  James
attr(,"scores")
James  Jane  John 
    3     2     1 
Levels: John Jane James

编辑 1

来自您的评论:

“@Chargaff 是的,它返回了正确的顺序,但是当我尝试在 ggplot 中使用这个数据框时,ggplot 仍然按照之前的顺序绘制它。”

看来您确实想为 ggplot 重新排序级别。我建议你这样做:

stest$group <- reorder(stest$group, stest$mean)

编辑 2

您最后的评论是上面的代码行“无效”。显然是这样:

> stest$group
[1] John  Jane  James
Levels: James Jane John         # <-------------------------------
> stest$group <- reorder(stest$group, stest$mean)              # |
> stest$group                                                  # |
[1] John  Jane  James                                          # |
attr(,"scores")                                                # | DIFFERENT :)
James  Jane  John                                              # |
    1     5     3                                              # | 
Levels: James John Jane        # <--------------------------------

【讨论】:

  • 对不起,我不明白其中的区别。文档说它会重新排序级别,那么为什么带有5 的 Jane 不在顶部或底部?
  • 看看我的例子。您的原始级别按"James" "Jane" "John" 的顺序排列,我将它们更改为1,2,3 因此现在级别,不是列中的数据,是John Jane James。也许你应该阅读?levels
  • 我在初始数据上尝试了levels(stest$group) &lt;- reorder(stest$group, stest$mean),它返回了与levels(stest$group) 相同的结果"John" "Jane" "James"。你能帮我解释一下为什么会这样吗?
  • 使用stest$group &lt;- reorder(stest$group, stest$mean)
  • ......只粘贴&gt;前面的代码。在这一点上我放弃了。
【解决方案2】:

我认为您想要返回索引的order 函数,而不是用于更改因子水平顺序的reorder。这样就可以了。

> stest[order(stest$mean),]

【讨论】:

    【解决方案3】:

    感谢 user1317221_G 和其他人,我发现了我的错误。

    订购我的数据集的正确代码是:

    stest$group <- reorder(stest$group, stest$mean, FUN=identity)
    

    虽然

    stest$group <- reorder(stest$group, stest$mean)
    

    没有订购我的数据框。不知道为什么FUN = mean 不起作用,但我必须指定identity

    可能的原因是这样的:Reordering factor gives different results, depending on which packages are loaded

    更新

    只有第一行代码是不够的。 reorder 不会将第二个参数强制转换为因子,因此最终排序可能不完整(例如,较高的值按降序排列低于较低的值)。

    因此,请确保您的订单正确:

    stest$group <- reorder(stest$group, as.factor(stest$mean), FUN=identity)
    

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 2018-11-27
      • 2023-01-19
      • 2019-02-18
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多