我正在尝试以下功能:
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
的建议,但我无法按预期工作。任何加载的包都可以干扰吗?
答案 0 :(得分:3)
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)