R中的函数重新排序和排序值

时间:2013-12-02 14:18:34

标签: r sorting

我正在尝试以下功能:

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的建议,但我无法按预期工作。任何加载的包都可以干扰吗?

3 个答案:

答案 0 :(得分:3)

来自documentation

  

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

注意重新排序级别,而不是列

比较

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        # <--------------------------------

答案 1 :(得分:1)

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

> stest[order(stest$mean),]

答案 2 :(得分:1)

感谢用户1317221_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)