2012-01-30 47 views
1

我在排序stat0列中的后面的数据帧(sds45)时遇到了特殊问题;R多列数据的排序

>sds45 

      icntr  iexpt angle overlap Specified.Shot.Width   V6 mcsp    stat0 
DD.Sigma2  3 1R50_50 45  0     50 rectangular 1.5 3.62075986666667 
DD.Sigma5  6 1R50_35 45  15     50 rectangular 1.5 1.07005992333333 
DD.Sigma8  9 1R50_40 45  10     50 rectangular 1.5  1.36916201 
DD.Sigma11 12 1R50_30 45  20     50 rectangular 1.5 0.951408239333333 
DD.Sigma14 15 1R100_75 45  25     100 rectangular 1.5 11.6972803333333 
DD.Sigma17 18 1R100_80 45  20     100 rectangular 1.5 13.4350596666667 
DD.Sigma20 21 1R100_90 45  10     100 rectangular 1.5   16.654366 
DD.Sigma31 32 1R100_150 45  50     100 rectangular 1.5 2.19166406666667 
DD.Sigma34 35 1R100_160 45  40     100 rectangular 1.5   5.4822418 
DD.Sigma39 40 1C200_25 45  75     100 circular 1.5  0.704197414 
DD.Sigma42 43 1C200_50 45  50     100 circular 1.5 1.03405964333333 
DD.Sigma45 46 1C200_75 45  25     100 circular 1.5 7.03481966666667 
DD.Sigma48 49 1C200_80 45  20     100 circular 1.5 9.19375816666667 

我的第一种方法是这样的:

test<-sds45[order(sds45$stat0),] 

...这什么也没做。

我也试过这样:

test=orderBy(~stat0, data=sds45) 

我必须有一个基本的概念问题。我希望对此有一点教育。

+0

是stat0列的数字?有趣的事情发生时,你排序字符向量!如果您订购数字,您首次尝试使用“订单”应该很好。 – Justin 2012-01-30 14:58:12

+2

我敢打赌,你的一些列是因素而不是字符/数字。在这种情况下,他们将按照他们的基本代码进行排序,而不是他们的级别使用'str(sds45)'来检查。 – 2012-01-30 15:00:59

+0

您的第一种方法适用于我。 'stat0'是数字列吗? 'str(sds45 $ stat0)'给了你什么? – 2012-01-30 15:01:56

回答

3

创建数据框时,可能在stat0中有一些非数字字符,因此该列已转换为因子。当你对这个因素进行排序时,你会根据底层的代码进行排序,这些代码将按照这些值出现的顺序排列,因此顺序不会改变。

解决方法是将该列转换为数字。

您可以转换系数是数字,如你预期它是使用:

factor_to_numeric <- function(f) 
{ 
    as.numeric(levels(f))[as.integer(f)] 
} 

sds45$stat0 <- factor_to_numeric(sds45$stat0) 

这是也是一个好主意非常重要检查您的数据集,试图找到那些非数字字符。如果该列包含脏数据,则数据集的其余部分可能还需要清理。

+0

谢谢Richie 。我感谢你的有益解释。 – bob123 2012-01-30 18:44:48

+0

解决方案是解决底层问题,而不是通过强制列是数字来解决问题。 – hadley 2012-02-01 01:14:36

+0

@hadley:同意。我已经修正了语言来澄清这一点。 – 2012-02-01 11:13:49