2012-10-31 37 views
20
data = c(1,2,3,4) 
names = c("foo", "bar", "baz", "yak") 
d = data.frame(data, row.names=names) 

này trả về:Làm cách nào để sắp xếp một data.frame chỉ với một cột mà không làm mất các tên gọi?

data 
foo 1 
bar 2 
baz 3 
yak 4 

Bây giờ, tôi muốn sắp xếp dataframe này bằng cách cột, mà không làm mất tên hàng kèm theo. Vì thế, kết quả tôi sẽ là:

data 
yak 4 
baz 3 
bar 2 
foo 1 

Tôi đã thử như sau:

  • d[order(-d$data),], mà các khóa học chỉ cho tôi danh sách một chiều.

  • arrange(d, desc(data)) từ gói plyr, làm giảm tên hàng.

  • Tìm hiểu các đơn đặt hàng với o = order(-d$data), sau đó tái tạo lại khung với

    data.frame(d[o,], row.names=rownames(d)[o]) 
    

    ... mà vẫn còn lá tôi với tên cột sai.

Có cách nào để làm điều này không?

Trả lời

29

Bạn đang ở rất gần với nỗ lực đầu tiên của bạn, chỉ cần quên về việc sử dụng drop = FALSE:

> d[order(-d$data), , drop = FALSE] 
    data 
yak 4 
baz 3 
bar 2 
foo 1 
+0

Ah, thú vị. Tôi bằng cách nào đó đã không tìm hiểu về điều này chỉ sau khi đọc từ khóa "thả" ở đây, mà bây giờ làm cho tôi nghĩ rằng liệu R rơi kích thước là một ý tưởng tốt hay không. Tôi sẽ đọc về điều đó. – slhck

+1

Tôi nghĩ mọi người đã hỏi câu hỏi này. Sự đồng thuận của các vị thần R là mặc định này không tốt lắm, nhưng nó không thể thay đổi mà không có mã lỗi hiện tại. Sẽ được sửa chữa trong Q. –

+0

Khi tôi sử dụng giải pháp này tôi lọc ra tất cả các hàng của tôi nhưng một. Làm sao chuyện này lại xảy ra? – Kory

Các vấn đề liên quan