2016-06-27 60 views
-1

我想按数字列对数据框进行排序,而我得到的是数字的字母数字排序。如果数据框被转换为矩阵,则排序工作。按数字列排序数据帧

df[order(as.numeric(df[,2])),] 

    V1 V2 
1 a 1 
3 c 10 
2 b 2 
4 d 3 

> m <- as.matrix(df) 
> m[order(as.numeric(m[,2])),] 

     V1 V2 
[1,] "a" "1" 
[2,] "b" "2" 
[3,] "d" "3" 
[4,] "c" "10" 
+2

您可能有一个“因素”列。试试'df [order(as.numeric(as.character(df [,2]))),]' – akrun

+1

[如何制作一个很好的R可重现的例子?](http://stackoverflow.com/questions/5963269) – zx8754

+0

您可以使用不断有用的'str'函数来检查akrun的理论。尝试一下你的data.frame,然后发布restults。 – lmo

回答

2
V1 <- letters[1:4] 
V2 <- as.character(c(1,10,2,3)) 
df <- data.frame(V1,V2, stringsAsFactors=FALSE) 
df[order(as.numeric(df[,2])),] 

V1 V2 
1 a 1 
3 c 2 
4 d 3 
2 b 10 

V1 <- letters[1:4] 
V2 <- as.character(c(1,10,2,3)) 
df <- data.frame(V1,V2) 
df[order(as.numeric(df[,2])),] 

给出

V1 V2 
1 a 1 
2 b 10 
3 c 2 
4 d 3 

这是由于因素。

感谢评论员akrun和Imo。用str(df)检查每个dfs。

另外,给出factor()函数帮助菜单有更多的细节。向下滚动到“警告”以获取有关该问题的更多详细信息。

-2

编辑:

列值可能会被视为因素。

尝试强制为字符,然后整数。

实例复制并粘贴控制台:

> Foo <- data.frame('ABC' = c('a','b','c','d'),'123' = c('1','2','10','3')) 
> Foo[order(as.integer(as.character(Foo[,2]))),] 
    ABC X123 
1 a 1 
2 b 2 
4 d 3 
3 c 10 
+0

这导致了相同的结果。我认为这是你收到失望的原因。 – scs

+0

谢谢,我只是假设会工作。测试它并找出如何去做。感谢您指出了这一点。 – ChristyCasey

1

你能成为一个更具体一点什么是你的INTIAL数据帧? 因为通过运行此代码:

df<-data.frame(c("a","b","c","d"),c(1,2,10,3)) 
colnames(df)<-c("V1","V2") 

#print(df) 

df.order<-df[order(as.numeric(df[,2])),] 

print(df.order) 

我得到正确的答案:

V1 V2 
1 a 1 
2 b 2 
4 d 3 
3 c 10