如何在R中按字符变量的字母顺序对数据框进行排序?

33

我想在R中按字符变量字母顺序对数据框进行排序。 我尝试使用order()函数进行操作,但它将我的数据框转换为列表。 有人知道该怎么做吗?


8
欢迎来到SO!您能发布一下您尝试过的代码和数据吗? - juba
6个回答

63

好的,这里我没有问题:

df <- data.frame(v=1:5, x=sample(LETTERS[1:5],5))
df

#   v x
# 1 1 D
# 2 2 A
# 3 3 B
# 4 4 C
# 5 5 E

df <- df[order(df$x),]
df

#   v x
# 2 2 A
# 3 3 B
# 4 4 C
# 1 1 D
# 5 5 E

14
#sort dataframe by col
sort.df <- with(df,  df[order(sortbythiscolumn) , ])

#can also sort by more than one variable: sort by col1 and then by col2
sort2.df <- with(df, df[order(col1, col2) , ])

#sort in reverse order
sort2.df <- with(df, df[order(col1, -col2) , ])

我认为这还不够清楚,这里应该是df$col1而不是col1。如果您能编辑这部分,我很乐意点赞。而且您可能也可以在这里添加对with的巧妙使用! - Arun
3
我更喜欢使用 df[with(df, order(col1, col2)),],但两者在底层看起来是相同的。 - Arun

9
plyr包中的arrange函数使按多列排序变得容易。例如,要首先按ID排序,然后按num递减排序DF,可以编写:
plyr::arrange(DF, ID, desc(num))

5

使用 order 函数:

set.seed(1)
DF <- data.frame(ID= sample(letters[1:26], 15, TRUE),
                 num = sample(1:100, 15, TRUE),
                 random = rnorm(15),
                 stringsAsFactors=FALSE)
DF[order(DF[,'ID']), ]
   ID num      random
10  b  27  0.61982575
12  e   2 -0.15579551
5   f  78  0.59390132
11  f  39 -0.05612874
1   g  50 -0.04493361
2   j  72 -0.01619026
14  j  87 -0.47815006
3   o 100  0.94383621
9   q  13 -1.98935170
8   r  66  0.07456498
13  r  39 -1.47075238
15  u  35  0.41794156
4   x  39  0.82122120
6   x  94  0.91897737
7   y  22  0.78213630

另一种解决方案是使用doBy包中的orderBy函数:
> library(doBy)
> orderBy(~ID, DF)

3

这个问题应该和@Ramnath的答案放在一起,但由于我声望还不够,无法进行评论。您也可以使用dplyr包中的arrange函数,与plyr包的使用方式相同。

library(dplyr)
arrange(DF, ID, desc(num))

2
order()函数在列具有级别或因子时会失败。当在创建data.frame时使用stringsAsFactors=FALSE时,它可以正常工作。

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