如何在R中按第二列对数据框进行排序?

22

可能是重复问题:
如何在R中按列对数据框进行排序

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

我有下面这个表格:

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

我希望按照集群对其进行排序/订购,以获得如下结果:

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代码:

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   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

为什么SampleIDs被数字1-15所代替,这些数字代表什么意思?我已经阅读了?order()页面,但是它似乎更好地解释了sort.list而不是order()。如果有人能帮助我解决这个问题,我将非常感激。

2个回答

12
简短的回答是你做得很好。只是你在读写文件时遇到了一些困难。请看你的代码:
data<-read.table('Table.txt', header=TRUE,row.names=1,sep='\t')

上述行读取您的数据很好,但row.names=1告诉它使用第一列作为行的名称。因此,现在您的样本ID是行名称而不是它们自己的列。如果您在运行此行后立即键入datahead(data)str(data),这应该是清楚的。只需省略该row.names参数,它就会正确读取。

data <- data.frame(data)

您不需要上面的那一行,因为read.table()会生成数据框。您也可以使用str(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)

在这里,您包含了参数col.names = FALSE,这就是为什么您的文件没有列名的原因。您也不需要/想要append=TRUE。如果您查看help(write.table),您会发现它“仅在文件是字符字符串时相关”。在这里,它似乎使文件写入而不结束最后一行,这可能会导致任何稍后的read.table()抱怨。
您结果中的1-15数字看起来像行号。您没有解释如何查看生成的文件,因此我不能确定。您可能以一种不解析行名称并显示行号的方式读取文件。如果您确保SampleIDs列不被分配为行名称,您可能会没问题。

非常感谢,现在完美地运行了,并且解释得非常好,您是一位明星。 - sinead

5

请看 plyr 包的 arrange 函数。

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

1
非常感谢您的建议,我会查看这个plyr包和这个函数。可能会很有用。 - sinead
更快、更简单、更好。 - linello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接