2011-08-01 98 views
6

我是R新手,想要對稱爲「權重」的數據幀進行排序。以下是詳細信息:如何排序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 

我想按降序順序排列attr_importance但我想保留相應的行名稱也。

我想:

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

,但它給了我一個 「數字」 了。

我想要一個數據框 - 它是按attr_importance排序的,並且有相應的行名完好無損。我怎樣才能做到這一點?

在此先感謝。

+4

@Jeff阿特伍德:不,現在的問題,但這些問題不重複的。我的問題更像是「如何在保留行名的同時進行排序」,而你所指的是「如何按多列排序」。 – user721975

+0

好吧,重新打開然後 - 道歉 –

回答

8

由於您的data.frame只有一列,你需要設置drop=FALSE防止尺寸而落下:

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

得到它感謝。我的頭正在旋轉。男人,R很難學:-( – user721975

+1

drop = FALSE是我忘記的修復:) – neilfws

+0

你救了我!有趣的是,sort()函數不保留行名稱! – weber85

9

這裏是data.frame排序大比較:

How to sort a dataframe by column(s)?

用我現在-首選方案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

整潔的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