根据R中的第一列对矩阵进行排序

根据R中的第一列对矩阵进行排序,r,R,我有一个矩阵,有两列,形式如下: 1 349 1 393 1 392 4 459 3 49 3 32 2 94 我希望根据第一列按递增顺序对该矩阵进行排序,但我希望将相应的值保留在第二列中 输出如下所示: 1 349 1 393 1 392 2 94 3 49 3 32 4 459 读取数据: foo <- read.table(text="1 349 1 393 1 392 4 459 3 49 3 32 2 94") 这取决于顺序保持领带的原始顺序。请参见

我有一个矩阵,有两列,形式如下:

1 349
1 393
1 392
4 459
3 49
3 32
2 94
我希望根据第一列按递增顺序对该矩阵进行排序,但我希望将相应的值保留在第二列中

输出如下所示:

1 349
1 393
1 392
2 94
3 49
3 32
4 459
读取数据:

foo <- read.table(text="1 349
  1 393
  1 392
  4 459
  3 49
  3 32
  2 94")

这取决于
顺序
保持领带的原始顺序。请参见
?订单

创建
数据。带有
key=V1的表
会自动为您执行此操作。使用Stephan的数据
foo

> require(data.table)
> foo.dt <- data.table(foo, key="V1")
> foo.dt
   V1  V2
1:  1 349
2:  1 393
3:  1 392
4:  2  94
5:  3  49
6:  3  32
7:  4 459
>需要(data.table)
>foo.dt foo.dt
V1 V2
1:  1 349
2:  1 393
3:  1 392
4:  2  94
5:  3  49
6:  3  32
7:  4 459

请注意,如果您希望以相反的顺序获取值,您可以轻松地执行以下操作:

> example = matrix(c(1,1,1,4,3,3,2,349,393,392,459,49,32,94), ncol = 2)
> example[order(example[,1], decreasing = TRUE),]
     [,1] [,2]
[1,]    4  459
[2,]    3   49
[3,]    3   32
[4,]    2   94
[5,]    1  349
[6,]    1  393
[7,]    1  392

如果数据位于名为
foo
的矩阵中,则要运行的行是


foo.sorted=foo[order[foo[,1]]

除非您将其应用于向量,否则接受的答案就像一个符咒。由于向量是非递归的,您将得到如下错误

$ operator is invalid for atomic vectors
在这种情况下,您可以使用
[

foo[order(foo["V1"]),]

很好,+1!有文件证明
数据。table
将键中的连接保持在原始顺序吗?如果没有,这可能会在
数据的较新版本中发生变化。table
?如果这样的变化破坏了使用较旧包版本编写的脚本,则很难找到。@StephanKolassa同意。是的,这是有文件证明的并且保证。从
?数据表
每个组中的行顺序和组的顺序一样被保留。
。并且在
?设置键
(在它自己的段落中):
排序是稳定的;即,领带的顺序(如果有的话)被保留。
@Arun,OP曾询问排序矩阵的问题
;正在转换为数据。表
和排序更好(=更快)与其他直接使用矩阵的方法相比?我的印象是,处理矩阵比列表更快,如
数据.xxx
对象(如果可能)。好主意,+1.或
foo[顺序(foo$V1,foo$V2),]
适用于那些与
斗争的人(如我)。当我想按降序排序时,该怎么办?//我已经尝试过了,但不起作用:
foo[order(foo$V1),discreating=TRUE]
降序
参数需要进入
order
函数,而不是
[/code>操作符:
foo[order(foo$V1,discreating=TRUE)]
foo[order(foo$V1),]
如果
foo
data.frame
。如果
foo
matrix
使用
foo[order(foo[,“V1”]),]
答案与数据有关。frame与矩阵无关,正如@Wakan Tanka指出的,我发现的最佳答案是:
foo[order(foo["V1"]),]