按数字列对数据进行排序

时间:2016-06-27 12:45:37

标签: r matrix

我正在尝试按一列数字对数据框进行排序,而我会对数字进行字母数字排序。如果数据框转换为矩阵,则排序有效。

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"

3 个答案:

答案 0 :(得分: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()函数帮助菜单的更多细节。向下滚动到“警告”以了解有关问题的更多详细信息。

答案 1 :(得分:1)

您是否可以更具体地了解您的初始数据帧? 因为通过运行此代码:

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

答案 2 :(得分:-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