2011-08-01 38 views
6

Tôi mới sử dụng R và muốn sắp xếp khung dữ liệu có tên là "trọng số". Dưới đây là các chi tiết:Cách sắp xếp khung dữ liệu trong R

>str(weights) 
'data.frame': 57 obs. of 1 variable: 
$ attr_importance: num 0.04963 0.09069 0.09819 0.00712 0.12543 ... 

> names(weights) 
    [1] "attr_importance" 

> dim(weights) 
    [1] 57 1 

> head(weights) 
     attr_importance 
make  0.049630556 
address  0.090686474 
all   0.098185517 
num3d  0.007122618 
our   0.125433292 
over  0.075182467 

Tôi muốn sắp xếp theo thứ tự giảm attr_importance NHƯNG Tôi muốn giữ nguyên tên hàng tương ứng.

tôi đã cố gắng:

> weights[order(-weights$attr_importance),] 

nhưng nó mang lại cho tôi một "số" trở lại.

Tôi muốn khung dữ liệu trở lại - được sắp xếp theo attr_importance và có CORRESPONDING tên hàng nguyên vẹn. Tôi có thể làm cái này như thế nào?

Xin cảm ơn trước.

+4

@Jeff Atwood: Không phải là vấn đề bây giờ, nhưng các câu hỏi không trùng lặp chút nào. Câu hỏi của tôi giống như "cách sắp xếp trong khi vẫn giữ tên hàng" trong khi câu hỏi bạn đề cập đến là "cách sắp xếp theo nhiều cột". – user721975

+0

ok, mở lại sau đó - xin lỗi –

Trả lời

8

Kể từ data.frame của bạn chỉ có một cột, bạn cần phải thiết lập drop=FALSE để ngăn chặn các kích thước không bị giảm:

weights[order(-weights$attr_importance),,drop=FALSE] 
#   attr_importance 
# our   0.125433292 
# all   0.098185517 
# address  0.090686474 
# over  0.075182467 
# make  0.049630556 
# num3d  0.007122618 
+1

OK. Đầu của tôi đang quay. Người đàn ông, R rất khó học :-( – user721975

+1

drop = FALSE là bản sửa lỗi mà tôi quên :) – neilfws

+0

bạn đã cứu tôi! điều thú vị là hàm sort() không bảo toàn tên hàng !!! – weber85

9

Đây là sự so sánh lớn trên data.frame phân loại:

How to sort a dataframe by column(s)?

Sử dụng giải pháp của tôi hiện nay được ưu tiên arrange:

dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
     levels = c("Low", "Med", "Hi"), ordered = TRUE), 
     x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9), 
     z = c(1, 1, 1, 2)) 
library(plyr) 
arrange(dd,desc(z),b) 
    b x y z 
1 Low C 9 2 
2 Med D 3 1 
3 Hi A 8 1 
4 Hi A 9 1 
+0

Neat trick.thanks. – user721975

0

rankdata.txt

regno name   total maths science social cat 
1 SUKUMARAN 400 78 89 73 S 
2 SHYAMALA 432 65 79 87 S 
3 MANOJ  500 90 129 78 C 
4 MILYPAULOSE 383 59 88 65 G 
5 ANSAL  278 39 77 60 O 
6 HAZEENA  273 45 55 56 O 
7 MANJUSHA 374 50 99 52 C 
8 BILBU  408 81 97 72 S 
9 JOSEPHROBIN 374 57 85 68 G 
10 SHINY  381 70 79 70 S 
z <- data.frame(rankdata) 

z[with(z, order(-total+ maths)),] #order function maths group selection 
z 
z[with(z, order(name)),] # sort on name 
z 
Các vấn đề liên quan