我有一些数字,我正在做一些订购。输出在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
答案 0 :(得分:3)
这种情况正在发生,因为您要对字符进行排序而不是数字。这是一个常见的问题,虽然不是一个明显的问题。对于初学者来说,使用order
对data.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
包中的mixedorder
或gtools
(以便快速替代),并且无需将列转换为数字,因为它处理任一字符数或字母数字字符串:
数据强>
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