根据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"]),]