50

我有一个包含以下形式的两列的矩阵:

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
4

6 回答 6

52

读取数据:

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

并排序:

foo[order(foo$V1),]

order这依赖于使关系保持原始顺序的事实。见?order

于 2013-01-16T13:40:40.087 回答
12

创建一个data.tablewithkey=V1会自动为你做这件事。使用斯蒂芬的数据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
于 2013-01-16T14:46:20.967 回答
8

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

> 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
于 2017-05-02T09:30:34.920 回答
2

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

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

于 2019-02-27T19:04:17.497 回答
1

除非您将其应用于向量,否则接受的答案就像一个魅力。由于向量是非递归的,你会得到这样的错误

$ operator is invalid for atomic vectors

你可以[在这种情况下使用

foo[order(foo["V1"]),]
于 2019-09-09T07:14:00.567 回答
0

你不需要data.table

这就是你需要的,你的数据矩阵在A[order(A[,1]), ]哪里。A

于 2018-03-30T08:56:33.187 回答