R对多列数据进行排序

时间:2012-01-30 14:51:26

标签: r sorting

我在stat0列中排序后面的数据框(sds45)时遇到了一个奇怪的问题;

>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)

我必须有一个基本的概念问题。我很感激对此的一点点教育。

1 个答案:

答案 0 :(得分:3)

创建数据框时,stat0中可能存在一些非数字字符,因此该列已转换为一个因子。当您对因子进行排序时,您将按基础级别代码进行排序,这些级别代码将按照这些值出现的顺序进行排序,因此顺序不会更改。

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

您可以使用:

将该因子转换为数字,如您所愿
factor_to_numeric <- function(f)
{
  as.numeric(levels(f))[as.integer(f)]
}

sds45$stat0 <- factor_to_numeric(sds45$stat0)

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