我正在尝试以下功能:
stest <- data.frame(group=c("John", "Jane", "James"), mean=c(3, 5, 1))
transform(stest, group = reorder(group, mean))
Run Code Online (Sandbox Code Playgroud)
并期望输出按 排序mean。相反,我得到:
group mean
1 John 3
2 Jane 5
3 James 1
Run Code Online (Sandbox Code Playgroud)
也就是说,与原始数据帧中的顺序相同。
我错过了什么吗?如何通过数据框的数值变量之一正确排序数据框?
周围的建议是关于使用的reorder,但我无法使其按预期工作。任何加载的包都会干扰吗?
从文档中
重新排序是一个通用函数。“默认”方法将其第一个参数视为分类变量,并根据第二个变量(通常是数字)的值重新排序其级别。
注意:重新排序级别,而不是因子变量的值(group在您的情况下)。
比较:
levels(stest$group)
[1] "James" "Jane" "John"
Run Code Online (Sandbox Code Playgroud)
和
> reorder(stest$group, c(1,2,3))
[1] John Jane James
attr(,"scores")
James Jane John
3 2 1
Levels: John Jane James
Run Code Online (Sandbox Code Playgroud)
编辑1
从你的评论来看:
“@Chargaff 是的,它返回正确的顺序,但是当我尝试在 ggplot 中使用这个数据框时,ggplot 仍然按照之前的顺序绘制它。”
看来你确实想重新排序 ggplot 的级别。我建议你这样做:
stest$group <- reorder(stest$group, stest$mean)
Run Code Online (Sandbox Code Playgroud)
编辑2
RE 您最后的评论是上面的代码行“无效”。显然它确实:
> 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 # <--------------------------------
Run Code Online (Sandbox Code Playgroud)