2012-11-14 7 views
13

thể trùng lặp:
How to sort a dataframe by column(s) in RTôi làm cách nào để đặt một khung dữ liệu theo cột thứ hai trong R?

Tôi chỉ tự hỏi nếu một số ai có thể giúp tôi ra, tôi có những gì tôi nghĩ phải là một vấn đề dễ dàng để giải quyết.

Tôi có bảng dưới đây:

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 

và tôi muốn sắp xếp/trật tự nó bằng cách Cụm để có được kết quả như sau:

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 

Tôi đã thử R sau mã:

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) 

và nhận được kết quả sau:

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 

Tại sao các SampleIDs được thay thế bằng những con số 1-15 và điều gì làm những con số đại diện, tôi đã đọc các trang ?order() tuy nhiên điều này dường như để giải thích sort.list tốt hơn hơn trật tự() nếu có ai có thể giúp tôi về điều này tôi sẽ rất biết ơn.

Trả lời

10

Câu trả lời ngắn gọn là bạn đã làm điều đó một cách hoàn hảo. Bạn chỉ gặp khó khăn khi đọc và ghi tệp. Đi qua mã của bạn:

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

Dòng trên được đọc trong mỹ dữ liệu của bạn, nhưng row.names=1 nói với nó để sử dụng cột đầu tiên làm tên cho các hàng. Vì vậy, bây giờ SampleID của bạn là tên hàng thay vì là cột riêng của chúng. Nếu bạn nhập data hoặc head(data) hoặc str(data) ngay sau khi chạy dòng này, điều này sẽ rõ ràng. Chỉ cần bỏ qua đối số row.names đó và nó sẽ đọc đúng.

data <- data.frame(data) 

Bạn không cần dòng này ở trên vì read.table() tạo khung dữ liệu. Bạn có thể thấy rằng với str(data) là tốt.

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

Dòng trên là hoàn hảo.

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

Ở đây bạn bao gồm đối số col.names = FALSE đó là lý do tệp của bạn không có tên cột. Bạn cũng không cần/muốn append=TRUE. Nếu bạn nhìn vào help(write.table), bạn sẽ thấy nó "chỉ liên quan nếu tệp là chuỗi ký tự". Ở đây có vẻ như để làm cho các tập tin ghi mà không kết thúc dòng cuối cùng, mà có khả năng sẽ gây ra bất kỳ sau này read.table() để khiếu nại.

Các số 1-15 trong kết quả của bạn trông giống như số hàng. Bạn không giải thích làm thế nào bạn nhìn vào tập tin kết quả, vì vậy tôi không thể chắc chắn. Bạn có thể đọc tệp của mình theo cách không phân tích cú pháp row.names và hiển thị số hàng thay thế. Nếu bạn chắc chắn cột SampleID của bạn không được chỉ định làm tên của các hàng, có thể bạn sẽ ổn.

+0

Cảm ơn bạn rất nhiều, Thats làm việc hoàn hảo ngay bây giờ, và đã được giải thích thực sự tốt, bạn là một ngôi sao. – sinead

5

Hãy xem chức năng arrange của gói plyr.

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

Cảm ơn một nhà máy cho đề xuất này, tôi sẽ xem xét gói plyr này và chức năng này. có thể hữu ích – sinead

+0

Nhanh hơn, đơn giản hơn, tốt hơn. – linello