R中的Order()函数没有正确排序。

6

我有一个数字的数据框并正在进行排序。输出结果将7放在70旁边,就好像7是70一样。为什么会这样呢?下面是粘贴的实际输出内容。请注意,263被视为比27小,就好像在27中的7后面有一个0一样。4在38之后,就好像4表示40一样。我正在使用order()。

 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

4
这是因为您的数字被视为字符串中的普通字符。我建议将数字放在它自己的列中,转换为数值型,并按此排序。 - data paRty
1
另一种选择是在字符前面添加0,以便正确排序:sort(sprintf('feat_%03s', c(25,26,263,27,27)))给出结果为 [1] [1] "feat_025" "feat_026" "feat_027" "feat_027" "feat_263" - rawr
2个回答

8
这是因为您排序的是字符而不是数字。这是一个常见的问题,尽管不是显而易见的问题。首先,使用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

2
你也可以使用gtools包中的mixedsortmixedorder(作为快速替代方案),无需将列转换为数字,因为它可以处理字符数字或字母数字字符串: 数据
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

有没有其他的替代方案可以像mixedsort/mixedorder一样很好地排序数字值? - Yoann Pageaud
1
@YoannPageaud 你所说的“好用”是什么意思?对于纯数字值,sortorder很好用。否则,mixedsortmixedorder也很好用。如果以上回答没有解决你的问题,请提出一个新问题并说明你需要什么。 - LyzandeR
我写错了,我的意思是不加载gtools包。但实际上,我认为我已经得到了答案:对于混合字符和数字,mixedsort是最适合的之一。 - Yoann Pageaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接