如何使用order函数对负值进行排序?

4
我正在尝试使用 order 函数对表格的某一列进行排序。
a<-c("-2","-7","-4")
b<-c("9","-1","3")


z<-data.frame(a,b)

当我要按列 a 排序 Z 时,从大到小排列,但它不起作用。该函数按其绝对值对负值进行排序。

z[order(z$a,decreasing=TRUE),]

当我尝试这个时,列a的z顺序会以递增或递减的方式出现。这似乎有效。您可以发布您想要查看数据的顺序和您正在查看数据的顺序吗? - ditkin
2
你真的想让 ab 成为因子吗?我猜这会导致反直觉的结果。 - Chase
2个回答

2

如果您需要将因子转换为数字,您必须先像FAQ所描述的那样转换为字符,然后再转换为数字:

 str(z)
#'data.frame':  3 obs. of  2 variables:
# $ a: Factor w/ 3 levels "-2","-4","-7": 1 3 2
# $ b: Factor w/ 3 levels "-1","3","9": 3 1 2

z[order( as.numeric(as.character(z$a)), decreasing=TRUE ), ]
   a  b
1 -2  9
3 -4  3
2 -7 -1

(说明:因子,除非它们是“有序因子”,否则是无序的,使用“>”或“<”进行比较将返回NA。)
> z$a[1] > z$a[2]
[1] NA
Warning message:
In Ops.factor(z$a[1], z$a[2]) : > not meaningful for factors

你努力实现的是将内部强制转换为数字,但结果并非如你所预期。
> z$a
[1] -2 -7 -4
Levels: -2 -4 -7
> as.numeric(z$a)
[1] 1 3 2

z[order(a)] 仍然按预期工作。-2,-4,-7 - 由大到小排序。或者这只是巧合正确吗? - Brandon Bertelsen
1
显然,这不是原帖作者所期望的顺序。他实际上没有说他期望什么。我假设他对“负数数字”作为字符与数字的文本排序顺序的差异感到困扰:“-2”>“-7” [1] FALSE; -2 > -7 [1] TRUE - IRTFM
1
z[order(a)] 之所以有效,是因为你有一个名为 a 的字符向量。当我们将其放入数据框中时,它会变成一个因子,你需要进行转换。它巧合地实现了你想要的效果,因为它将字符读取为破折号数字,因此在排序中,"-9" 大于 "-1"。由于所有值都是负数,所以你得到了递减的效果,但这只是一种巧合。 - Sacha Epskamp

-1

这是一个简单的向量:

x <- c(2, 4, 0.5, -0.5 ,-1, 3,10) 
print(x) 
2.0  4.0  0.5 -0.5 -1.0  3.0 10.0
> order(x)
 5 4 3 1 6 2 7 # Not cool

> match(x, sort(x)) 
4 6 3 2 1 5 7 # Cool

这与原帖有什么关系(原帖包含了你没有提到的例子/问题)?顺便说一句,你最后一行得到的结果与 rank(x) 相同。 - Frank
“order” 给出了允许您按升序排序项目的值……等待它……“顺序”。因此,最低项(-0.5)获得值=1,最高值(10)获得最大值=7,这正是非常酷的。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接