如何通过R中的第二列订购数据帧?

How can I order a dataframe by the second column in R?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to sort a dataframe by column(s) in R

我只是想知道是否有人能帮助我,我有一个我认为应该是一个容易解决的问题。

我有下表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SampleID           Cluster

R0132F041p          1

R0132F127           1

R0132F064           1

R0132F068p          1

R0132F015           2

R0132F094           3

R0132F105           1

R0132F013           2

R0132F114           1

R0132F014           2

R0132F039p          3

R0132F137           1

R0132F059           1

R0132F138p          2

R0132F038p          2

我想按集群对其进行排序,得到如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SampleID    Cluster

R0132F041p  1

R0132F127   1

R0132F064   1

R0132F068p  1

R0132F105   1

R0132F114   1

R0132F137   1

R0132F059   1

R0132F015   2

R0132F013   2

R0132F014   2

R0132F138p  2

R0132F038p  2

R0132F094   3

R0132F039p  3

我尝试了以下R代码:

1
2
3
4
5
data<-read.table('Table.txt', header=TRUE,row.names=1,sep='\t')

data <- data.frame(data)
data <- data[order(data$Cluster),]
write.table(data, file = 'OrderedTable.txt', append = TRUE,quote=FALSE, sep = '\t', na ='NA', dec = '.', row.names = TRUE, col.names = FALSE)

并得到以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1   1

2   1

3   1

4   1

5   1

6   1

7   1

8   1

9   2

10  2

11  2

12  2

13  2

14  3

15  3

为什么样本被数字1-15替换,这些数字代表什么?我已经阅读了?order()页,但是这似乎解释了sort.list比order()更好,如果有人能帮我解决这个问题,我将非常感谢。


简短的回答是你做得很完美。你读写文件有点困难。查看您的代码:

1
data<-read.table('Table.txt', header=TRUE,row.names=1,sep='\t')

上面这一行可以读取您的数据,但是row.names=1告诉它使用第一列作为行的名称。所以现在您的sampleid是行名称,而不是它们自己的列。如果您在运行此线路后立即键入datahead(data)str(data),这应该是清楚的。只要省略row.names参数,它就会正确读取。

1
data <- data.frame(data)

由于read.table()生成了一个数据帧,所以您不需要在上面这一行。你也可以从str(data)中看到这一点。

1
data <- data[order(data$Cluster),]

上面这条线是完美的。

1
2
3
write.table(data, file = 'OrderedTable.txt', append = TRUE,
   quote=FALSE, sep = '\t', na ='NA', dec = '.', row.names = TRUE,
   col.names = FALSE)

这里包括参数col.names = FALSE,这就是您的文件没有列名的原因。您也不需要/不需要append=TRUE。如果您查看help(write.table),您会看到它"仅当文件是字符串时才相关"。在这里,它似乎使文件在不结束最后一行的情况下写入,这可能会导致任何后来的read.table()抱怨。

结果中的数字1-15类似于行号。您没有解释如何查看结果文件,因此我不能确定。您读取文件的方式可能不解析row.name,而是显示行数。如果您确定您的sampleids列没有被指定为行的名称,那么您可能会没事的。


看看plyr包的arrange功能。

1
2
arrange(data, Cluster)
write.table(data,"ordered_data.txt")