r中的Order()函数未正确排序

时间:2015-04-01 19:48:22

标签: r

我有一些数字,我正在做一些订购。输出在70旁边放置7,好像7是70.为什么会发生这种情况。下面粘贴的东西是实际输出。请注意263如何处理小于27,好像在27中的7后面有一个0.4在38之后,好像4表示40.我正在使用订单()。

 feat_1  25
 feat_10  26
 feat_24 263
 feat_48  27
 feat_55  27
 feat_75  36
 feat_16  37
 feat_53  38
 feat_89  38
 feat_28   4

2 个答案:

答案 0 :(得分:3)

这种情况正在发生,因为您要对字符进行排序而不是数字。这是一个常见的问题,虽然不是一个明显的问题。对于初学者来说,使用orderdata.frame进行排序很容易,这就是我将用于在我的测试用例中演示解决方案的内容。

你应该试试这个:

col1 <- c('a', 'b', 'c')
col2 <- c("25", "42" ,"4")
df <- data.frame(col1, col2)

## This is the wrong approach:
df[order(df$col2),]
col1 col2
1   a   25
3   c    4
2   b   42

## This is the right approach, conver the second vector to numeric vector:
df$col2 <- as.numeric(as.character(df$col2))
df[order(df$col2),]
  col1 col2
3   c    4
1   a   25
2   b   42

答案 1 :(得分:1)

您还可以使用mixedsort包中的mixedordergtools(以便快速替代),并且无需将列转换为数字,因为它处理任一字符数或字母数字字符串:

数据

df <- read.table(text='feat_1  25
 feat_10  "26"
 feat_24  "263"
 feat_48  "27"
 feat_55  "27"
 feat_75  "36"
 feat_16  "37"
 feat_53  "38"
 feat_89  "38"
 feat_28   "4"')

<强>解决方案

library(gtools)
#you use mixedorder in exactly the same way as base order
> df[mixedorder(df$V2),]
        V1  V2
10 feat_28   4
1   feat_1  25
2  feat_10  26
4  feat_48  27
5  feat_55  27
6  feat_75  36
7  feat_16  37
8  feat_53  38
9  feat_89  38
3  feat_24 263