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

use*_*765 48 r

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

1 349
1 393
1 392
4 459
3 49
3 32
2 94
Run Code Online (Sandbox Code Playgroud)

我想基于第一列按递增顺序对此矩阵进行排序,但我想在第二列中保留相应的值.

输出看起来像这样:

1 349
1 393
1 392
2 94
3 49
3 32
4 459
Run Code Online (Sandbox Code Playgroud)

S. *_*ica 48

阅读数据:

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

排序:

foo[order(foo$V1),]
Run Code Online (Sandbox Code Playgroud)

这依赖于order保持原始秩序联系的事实.见?order.

  • 好主意,+ 1.或者`foo [order(foo $ V1,foo $ V2),]`对于那些与`with`(像我一样)挣扎的人. (3认同)
  • 如果`foo`是`data.frame`,`foo [order(foo $ V1),]`有效.如果`foo`是`matrix`,请使用`foo [order(foo [,"V1"]),]` (3认同)

Aru*_*run 12

创建一个data.tablewith会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
Run Code Online (Sandbox Code Playgroud)

  • +1也是.@StephanKolassa同意了.是的,这是记录和保证.来自`?data.table`:`保存每个组中行的顺序,以及组的顺序.在`?setkey`(在它自己的段落中):`排序是稳定的; 即,保留关系的顺序(如果有的话). (5认同)
  • 不错,+1!是否记录了`data.table`在原始顺序中保持键的关系?如果没有,这可能会在更新版本的`data.table`中发生变化吗?如果这些更改破坏了使用旧版软件包编写的脚本,则很难找到这些更改. (2认同)

小智 5

请注意,如果您想按相反的顺序获取值,则可以轻松地做到这一点:

> 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
Run Code Online (Sandbox Code Playgroud)